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_OPENBSD 0 22#define LIBFUZZER_WINDOWS 0 23#define LIBFUZZER_EMSCRIPTEN 0 24#elif __APPLE__ 25#define LIBFUZZER_APPLE 1 26#define LIBFUZZER_FUCHSIA 0 27#define LIBFUZZER_LINUX 0 28#define LIBFUZZER_NETBSD 0 29#define LIBFUZZER_FREEBSD 0 30#define LIBFUZZER_OPENBSD 0 31#define LIBFUZZER_WINDOWS 0 32#define LIBFUZZER_EMSCRIPTEN 0 33#elif __NetBSD__ 34#define LIBFUZZER_APPLE 0 35#define LIBFUZZER_FUCHSIA 0 36#define LIBFUZZER_LINUX 0 37#define LIBFUZZER_NETBSD 1 38#define LIBFUZZER_FREEBSD 0 39#define LIBFUZZER_OPENBSD 0 40#define LIBFUZZER_WINDOWS 0 41#define LIBFUZZER_EMSCRIPTEN 0 42#elif __FreeBSD__ 43#define LIBFUZZER_APPLE 0 44#define LIBFUZZER_FUCHSIA 0 45#define LIBFUZZER_LINUX 0 46#define LIBFUZZER_NETBSD 0 47#define LIBFUZZER_FREEBSD 1 48#define LIBFUZZER_OPENBSD 0 49#define LIBFUZZER_WINDOWS 0 50#define LIBFUZZER_EMSCRIPTEN 0 51#elif __OpenBSD__ 52#define LIBFUZZER_APPLE 0 53#define LIBFUZZER_FUCHSIA 0 54#define LIBFUZZER_LINUX 0 55#define LIBFUZZER_NETBSD 0 56#define LIBFUZZER_FREEBSD 0 57#define LIBFUZZER_OPENBSD 1 58#define LIBFUZZER_WINDOWS 0 59#define LIBFUZZER_EMSCRIPTEN 0 60#elif _WIN32 61#define LIBFUZZER_APPLE 0 62#define LIBFUZZER_FUCHSIA 0 63#define LIBFUZZER_LINUX 0 64#define LIBFUZZER_NETBSD 0 65#define LIBFUZZER_FREEBSD 0 66#define LIBFUZZER_OPENBSD 0 67#define LIBFUZZER_WINDOWS 1 68#define LIBFUZZER_EMSCRIPTEN 0 69#elif __Fuchsia__ 70#define LIBFUZZER_APPLE 0 71#define LIBFUZZER_FUCHSIA 1 72#define LIBFUZZER_LINUX 0 73#define LIBFUZZER_NETBSD 0 74#define LIBFUZZER_FREEBSD 0 75#define LIBFUZZER_OPENBSD 0 76#define LIBFUZZER_WINDOWS 0 77#define LIBFUZZER_EMSCRIPTEN 0 78#elif __EMSCRIPTEN__ 79#define LIBFUZZER_APPLE 0 80#define LIBFUZZER_FUCHSIA 0 81#define LIBFUZZER_LINUX 0 82#define LIBFUZZER_NETBSD 0 83#define LIBFUZZER_FREEBSD 0 84#define LIBFUZZER_OPENBSD 0 85#define LIBFUZZER_WINDOWS 0 86#define LIBFUZZER_EMSCRIPTEN 1 87#else 88#error "Support for your platform has not been implemented" 89#endif 90 91#if defined(_MSC_VER) && !defined(__clang__) 92// MSVC compiler is being used. 93#define LIBFUZZER_MSVC 1 94#else 95#define LIBFUZZER_MSVC 0 96#endif 97 98#ifndef __has_attribute 99#define __has_attribute(x) 0 100#endif 101 102#define LIBFUZZER_POSIX \ 103 (LIBFUZZER_APPLE || LIBFUZZER_LINUX || LIBFUZZER_NETBSD || \ 104 LIBFUZZER_FREEBSD || LIBFUZZER_OPENBSD || LIBFUZZER_EMSCRIPTEN) 105 106#ifdef __x86_64 107#if __has_attribute(target) 108#define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt"))) 109#else 110#define ATTRIBUTE_TARGET_POPCNT 111#endif 112#else 113#define ATTRIBUTE_TARGET_POPCNT 114#endif 115 116#ifdef __clang__ // avoid gcc warning. 117#if __has_attribute(no_sanitize) 118#define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory"))) 119#else 120#define ATTRIBUTE_NO_SANITIZE_MEMORY 121#endif 122#define ALWAYS_INLINE __attribute__((always_inline)) 123#else 124#define ATTRIBUTE_NO_SANITIZE_MEMORY 125#define ALWAYS_INLINE 126#endif // __clang__ 127 128#if LIBFUZZER_WINDOWS 129#define ATTRIBUTE_NO_SANITIZE_ADDRESS 130#else 131#define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) 132#endif 133 134#if LIBFUZZER_WINDOWS 135#define ATTRIBUTE_ALIGNED(X) __declspec(align(X)) 136#define ATTRIBUTE_INTERFACE __declspec(dllexport) 137// This is used for __sancov_lowest_stack which is needed for 138// -fsanitize-coverage=stack-depth. That feature is not yet available on 139// Windows, so make the symbol static to avoid linking errors. 140#define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC static 141#define ATTRIBUTE_NOINLINE __declspec(noinline) 142#else 143#define ATTRIBUTE_ALIGNED(X) __attribute__((aligned(X))) 144#define ATTRIBUTE_INTERFACE __attribute__((visibility("default"))) 145#define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC \ 146 ATTRIBUTE_INTERFACE __attribute__((tls_model("initial-exec"))) thread_local 147 148#define ATTRIBUTE_NOINLINE __attribute__((noinline)) 149#endif 150 151#if defined(__has_feature) 152#if __has_feature(address_sanitizer) 153#define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS 154#elif __has_feature(memory_sanitizer) 155#define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY 156#else 157#define ATTRIBUTE_NO_SANITIZE_ALL 158#endif 159#else 160#define ATTRIBUTE_NO_SANITIZE_ALL 161#endif 162 163#endif // LLVM_FUZZER_PLATFORM_H 164