1 //===-- FuzzerPlatform.h --------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // Common platform macros. 9 //===----------------------------------------------------------------------===// 10 11 #ifndef LLVM_FUZZER_PLATFORM_H 12 #define LLVM_FUZZER_PLATFORM_H 13 14 // Platform detection. 15 #ifdef __linux__ 16 #define LIBFUZZER_APPLE 0 17 #define LIBFUZZER_FUCHSIA 0 18 #define LIBFUZZER_LINUX 1 19 #define LIBFUZZER_NETBSD 0 20 #define LIBFUZZER_FREEBSD 0 21 #define LIBFUZZER_WINDOWS 0 22 #define LIBFUZZER_EMSCRIPTEN 0 23 #elif __APPLE__ 24 #define LIBFUZZER_APPLE 1 25 #define LIBFUZZER_FUCHSIA 0 26 #define LIBFUZZER_LINUX 0 27 #define LIBFUZZER_NETBSD 0 28 #define LIBFUZZER_FREEBSD 0 29 #define LIBFUZZER_WINDOWS 0 30 #define LIBFUZZER_EMSCRIPTEN 0 31 #elif __NetBSD__ 32 #define LIBFUZZER_APPLE 0 33 #define LIBFUZZER_FUCHSIA 0 34 #define LIBFUZZER_LINUX 0 35 #define LIBFUZZER_NETBSD 1 36 #define LIBFUZZER_FREEBSD 0 37 #define LIBFUZZER_WINDOWS 0 38 #define LIBFUZZER_EMSCRIPTEN 0 39 #elif __FreeBSD__ 40 #define LIBFUZZER_APPLE 0 41 #define LIBFUZZER_FUCHSIA 0 42 #define LIBFUZZER_LINUX 0 43 #define LIBFUZZER_NETBSD 0 44 #define LIBFUZZER_FREEBSD 1 45 #define LIBFUZZER_WINDOWS 0 46 #define LIBFUZZER_EMSCRIPTEN 0 47 #elif _WIN32 48 #define LIBFUZZER_APPLE 0 49 #define LIBFUZZER_FUCHSIA 0 50 #define LIBFUZZER_LINUX 0 51 #define LIBFUZZER_NETBSD 0 52 #define LIBFUZZER_FREEBSD 0 53 #define LIBFUZZER_WINDOWS 1 54 #define LIBFUZZER_EMSCRIPTEN 0 55 #elif __Fuchsia__ 56 #define LIBFUZZER_APPLE 0 57 #define LIBFUZZER_FUCHSIA 1 58 #define LIBFUZZER_LINUX 0 59 #define LIBFUZZER_NETBSD 0 60 #define LIBFUZZER_FREEBSD 0 61 #define LIBFUZZER_WINDOWS 0 62 #define LIBFUZZER_EMSCRIPTEN 0 63 #elif __EMSCRIPTEN__ 64 #define LIBFUZZER_APPLE 0 65 #define LIBFUZZER_FUCHSIA 0 66 #define LIBFUZZER_LINUX 0 67 #define LIBFUZZER_NETBSD 0 68 #define LIBFUZZER_FREEBSD 0 69 #define LIBFUZZER_WINDOWS 0 70 #define LIBFUZZER_EMSCRIPTEN 1 71 #else 72 #error "Support for your platform has not been implemented" 73 #endif 74 75 #if defined(_MSC_VER) && !defined(__clang__) 76 // MSVC compiler is being used. 77 #define LIBFUZZER_MSVC 1 78 #else 79 #define LIBFUZZER_MSVC 0 80 #endif 81 82 #ifndef __has_attribute 83 #define __has_attribute(x) 0 84 #endif 85 86 #define LIBFUZZER_POSIX \ 87 (LIBFUZZER_APPLE || LIBFUZZER_LINUX || LIBFUZZER_NETBSD || \ 88 LIBFUZZER_FREEBSD || LIBFUZZER_EMSCRIPTEN) 89 90 #ifdef __x86_64 91 #if __has_attribute(target) 92 #define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt"))) 93 #else 94 #define ATTRIBUTE_TARGET_POPCNT 95 #endif 96 #else 97 #define ATTRIBUTE_TARGET_POPCNT 98 #endif 99 100 #ifdef __clang__ // avoid gcc warning. 101 #if __has_attribute(no_sanitize) 102 #define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory"))) 103 #else 104 #define ATTRIBUTE_NO_SANITIZE_MEMORY 105 #endif 106 #define ALWAYS_INLINE __attribute__((always_inline)) 107 #else 108 #define ATTRIBUTE_NO_SANITIZE_MEMORY 109 #define ALWAYS_INLINE 110 #endif // __clang__ 111 112 #if LIBFUZZER_WINDOWS 113 #define ATTRIBUTE_NO_SANITIZE_ADDRESS 114 #else 115 #define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) 116 #endif 117 118 #if LIBFUZZER_WINDOWS 119 #define ATTRIBUTE_ALIGNED(X) __declspec(align(X)) 120 #define ATTRIBUTE_INTERFACE __declspec(dllexport) 121 // This is used for __sancov_lowest_stack which is needed for 122 // -fsanitize-coverage=stack-depth. That feature is not yet available on 123 // Windows, so make the symbol static to avoid linking errors. 124 #define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC static 125 #define ATTRIBUTE_NOINLINE __declspec(noinline) 126 #else 127 #define ATTRIBUTE_ALIGNED(X) __attribute__((aligned(X))) 128 #define ATTRIBUTE_INTERFACE __attribute__((visibility("default"))) 129 #define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC \ 130 ATTRIBUTE_INTERFACE __attribute__((tls_model("initial-exec"))) thread_local 131 132 #define ATTRIBUTE_NOINLINE __attribute__((noinline)) 133 #endif 134 135 #if defined(__has_feature) 136 #if __has_feature(address_sanitizer) 137 #define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS 138 #elif __has_feature(memory_sanitizer) 139 #define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY 140 #else 141 #define ATTRIBUTE_NO_SANITIZE_ALL 142 #endif 143 #else 144 #define ATTRIBUTE_NO_SANITIZE_ALL 145 #endif 146 147 #endif // LLVM_FUZZER_PLATFORM_H 148