11f9cb04fSpatrick //===-- FuzzerPlatform.h --------------------------------------------------===// 21f9cb04fSpatrick // 31f9cb04fSpatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 41f9cb04fSpatrick // See https://llvm.org/LICENSE.txt for license information. 51f9cb04fSpatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 61f9cb04fSpatrick // 71f9cb04fSpatrick //===----------------------------------------------------------------------===// 81f9cb04fSpatrick // Common platform macros. 91f9cb04fSpatrick //===----------------------------------------------------------------------===// 101f9cb04fSpatrick 111f9cb04fSpatrick #ifndef LLVM_FUZZER_PLATFORM_H 121f9cb04fSpatrick #define LLVM_FUZZER_PLATFORM_H 131f9cb04fSpatrick 141f9cb04fSpatrick // Platform detection. 151f9cb04fSpatrick #ifdef __linux__ 161f9cb04fSpatrick #define LIBFUZZER_APPLE 0 171f9cb04fSpatrick #define LIBFUZZER_FUCHSIA 0 181f9cb04fSpatrick #define LIBFUZZER_LINUX 1 191f9cb04fSpatrick #define LIBFUZZER_NETBSD 0 201f9cb04fSpatrick #define LIBFUZZER_FREEBSD 0 211f9cb04fSpatrick #define LIBFUZZER_WINDOWS 0 221f9cb04fSpatrick #define LIBFUZZER_EMSCRIPTEN 0 231f9cb04fSpatrick #elif __APPLE__ 241f9cb04fSpatrick #define LIBFUZZER_APPLE 1 251f9cb04fSpatrick #define LIBFUZZER_FUCHSIA 0 261f9cb04fSpatrick #define LIBFUZZER_LINUX 0 271f9cb04fSpatrick #define LIBFUZZER_NETBSD 0 281f9cb04fSpatrick #define LIBFUZZER_FREEBSD 0 291f9cb04fSpatrick #define LIBFUZZER_WINDOWS 0 301f9cb04fSpatrick #define LIBFUZZER_EMSCRIPTEN 0 311f9cb04fSpatrick #elif __NetBSD__ 321f9cb04fSpatrick #define LIBFUZZER_APPLE 0 331f9cb04fSpatrick #define LIBFUZZER_FUCHSIA 0 341f9cb04fSpatrick #define LIBFUZZER_LINUX 0 351f9cb04fSpatrick #define LIBFUZZER_NETBSD 1 361f9cb04fSpatrick #define LIBFUZZER_FREEBSD 0 371f9cb04fSpatrick #define LIBFUZZER_WINDOWS 0 381f9cb04fSpatrick #define LIBFUZZER_EMSCRIPTEN 0 391f9cb04fSpatrick #elif __FreeBSD__ 401f9cb04fSpatrick #define LIBFUZZER_APPLE 0 411f9cb04fSpatrick #define LIBFUZZER_FUCHSIA 0 421f9cb04fSpatrick #define LIBFUZZER_LINUX 0 431f9cb04fSpatrick #define LIBFUZZER_NETBSD 0 441f9cb04fSpatrick #define LIBFUZZER_FREEBSD 1 451f9cb04fSpatrick #define LIBFUZZER_WINDOWS 0 461f9cb04fSpatrick #define LIBFUZZER_EMSCRIPTEN 0 471f9cb04fSpatrick #elif _WIN32 481f9cb04fSpatrick #define LIBFUZZER_APPLE 0 491f9cb04fSpatrick #define LIBFUZZER_FUCHSIA 0 501f9cb04fSpatrick #define LIBFUZZER_LINUX 0 511f9cb04fSpatrick #define LIBFUZZER_NETBSD 0 521f9cb04fSpatrick #define LIBFUZZER_FREEBSD 0 531f9cb04fSpatrick #define LIBFUZZER_WINDOWS 1 541f9cb04fSpatrick #define LIBFUZZER_EMSCRIPTEN 0 551f9cb04fSpatrick #elif __Fuchsia__ 561f9cb04fSpatrick #define LIBFUZZER_APPLE 0 571f9cb04fSpatrick #define LIBFUZZER_FUCHSIA 1 581f9cb04fSpatrick #define LIBFUZZER_LINUX 0 591f9cb04fSpatrick #define LIBFUZZER_NETBSD 0 601f9cb04fSpatrick #define LIBFUZZER_FREEBSD 0 611f9cb04fSpatrick #define LIBFUZZER_WINDOWS 0 621f9cb04fSpatrick #define LIBFUZZER_EMSCRIPTEN 0 631f9cb04fSpatrick #elif __EMSCRIPTEN__ 641f9cb04fSpatrick #define LIBFUZZER_APPLE 0 651f9cb04fSpatrick #define LIBFUZZER_FUCHSIA 0 661f9cb04fSpatrick #define LIBFUZZER_LINUX 0 671f9cb04fSpatrick #define LIBFUZZER_NETBSD 0 681f9cb04fSpatrick #define LIBFUZZER_FREEBSD 0 691f9cb04fSpatrick #define LIBFUZZER_WINDOWS 0 701f9cb04fSpatrick #define LIBFUZZER_EMSCRIPTEN 1 711f9cb04fSpatrick #else 721f9cb04fSpatrick #error "Support for your platform has not been implemented" 731f9cb04fSpatrick #endif 741f9cb04fSpatrick 751f9cb04fSpatrick #if defined(_MSC_VER) && !defined(__clang__) 761f9cb04fSpatrick // MSVC compiler is being used. 771f9cb04fSpatrick #define LIBFUZZER_MSVC 1 781f9cb04fSpatrick #else 791f9cb04fSpatrick #define LIBFUZZER_MSVC 0 801f9cb04fSpatrick #endif 811f9cb04fSpatrick 821f9cb04fSpatrick #ifndef __has_attribute 831f9cb04fSpatrick #define __has_attribute(x) 0 841f9cb04fSpatrick #endif 851f9cb04fSpatrick 861f9cb04fSpatrick #define LIBFUZZER_POSIX \ 871f9cb04fSpatrick (LIBFUZZER_APPLE || LIBFUZZER_LINUX || LIBFUZZER_NETBSD || \ 88*d89ec533Spatrick LIBFUZZER_FREEBSD || LIBFUZZER_EMSCRIPTEN) 891f9cb04fSpatrick 901f9cb04fSpatrick #ifdef __x86_64 911f9cb04fSpatrick #if __has_attribute(target) 921f9cb04fSpatrick #define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt"))) 931f9cb04fSpatrick #else 941f9cb04fSpatrick #define ATTRIBUTE_TARGET_POPCNT 951f9cb04fSpatrick #endif 961f9cb04fSpatrick #else 971f9cb04fSpatrick #define ATTRIBUTE_TARGET_POPCNT 981f9cb04fSpatrick #endif 991f9cb04fSpatrick 1001f9cb04fSpatrick #ifdef __clang__ // avoid gcc warning. 1011f9cb04fSpatrick #if __has_attribute(no_sanitize) 1021f9cb04fSpatrick #define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory"))) 1031f9cb04fSpatrick #else 1041f9cb04fSpatrick #define ATTRIBUTE_NO_SANITIZE_MEMORY 1051f9cb04fSpatrick #endif 1061f9cb04fSpatrick #define ALWAYS_INLINE __attribute__((always_inline)) 1071f9cb04fSpatrick #else 1081f9cb04fSpatrick #define ATTRIBUTE_NO_SANITIZE_MEMORY 1091f9cb04fSpatrick #define ALWAYS_INLINE 1101f9cb04fSpatrick #endif // __clang__ 1111f9cb04fSpatrick 1121f9cb04fSpatrick #if LIBFUZZER_WINDOWS 1131f9cb04fSpatrick #define ATTRIBUTE_NO_SANITIZE_ADDRESS 1141f9cb04fSpatrick #else 1151f9cb04fSpatrick #define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) 1161f9cb04fSpatrick #endif 1171f9cb04fSpatrick 1181f9cb04fSpatrick #if LIBFUZZER_WINDOWS 1191f9cb04fSpatrick #define ATTRIBUTE_ALIGNED(X) __declspec(align(X)) 1201f9cb04fSpatrick #define ATTRIBUTE_INTERFACE __declspec(dllexport) 1211f9cb04fSpatrick // This is used for __sancov_lowest_stack which is needed for 1221f9cb04fSpatrick // -fsanitize-coverage=stack-depth. That feature is not yet available on 1231f9cb04fSpatrick // Windows, so make the symbol static to avoid linking errors. 1241f9cb04fSpatrick #define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC static 1251f9cb04fSpatrick #define ATTRIBUTE_NOINLINE __declspec(noinline) 1261f9cb04fSpatrick #else 1271f9cb04fSpatrick #define ATTRIBUTE_ALIGNED(X) __attribute__((aligned(X))) 1281f9cb04fSpatrick #define ATTRIBUTE_INTERFACE __attribute__((visibility("default"))) 1291f9cb04fSpatrick #define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC \ 1301f9cb04fSpatrick ATTRIBUTE_INTERFACE __attribute__((tls_model("initial-exec"))) thread_local 1311f9cb04fSpatrick 1321f9cb04fSpatrick #define ATTRIBUTE_NOINLINE __attribute__((noinline)) 1331f9cb04fSpatrick #endif 1341f9cb04fSpatrick 1351f9cb04fSpatrick #if defined(__has_feature) 1361f9cb04fSpatrick #if __has_feature(address_sanitizer) 1371f9cb04fSpatrick #define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS 1381f9cb04fSpatrick #elif __has_feature(memory_sanitizer) 1391f9cb04fSpatrick #define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY 1401f9cb04fSpatrick #else 1411f9cb04fSpatrick #define ATTRIBUTE_NO_SANITIZE_ALL 1421f9cb04fSpatrick #endif 1431f9cb04fSpatrick #else 1441f9cb04fSpatrick #define ATTRIBUTE_NO_SANITIZE_ALL 1451f9cb04fSpatrick #endif 1461f9cb04fSpatrick 1471f9cb04fSpatrick #endif // LLVM_FUZZER_PLATFORM_H 148