15ffd83dbSDimitry Andric //===-- FuzzerPlatform.h --------------------------------------------------===// 25ffd83dbSDimitry Andric // 35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ffd83dbSDimitry Andric // 75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 85ffd83dbSDimitry Andric // Common platform macros. 95ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 105ffd83dbSDimitry Andric 115ffd83dbSDimitry Andric #ifndef LLVM_FUZZER_PLATFORM_H 125ffd83dbSDimitry Andric #define LLVM_FUZZER_PLATFORM_H 135ffd83dbSDimitry Andric 145ffd83dbSDimitry Andric // Platform detection. 155ffd83dbSDimitry Andric #ifdef __linux__ 165ffd83dbSDimitry Andric #define LIBFUZZER_APPLE 0 175ffd83dbSDimitry Andric #define LIBFUZZER_FUCHSIA 0 185ffd83dbSDimitry Andric #define LIBFUZZER_LINUX 1 195ffd83dbSDimitry Andric #define LIBFUZZER_NETBSD 0 205ffd83dbSDimitry Andric #define LIBFUZZER_FREEBSD 0 215ffd83dbSDimitry Andric #define LIBFUZZER_WINDOWS 0 225ffd83dbSDimitry Andric #define LIBFUZZER_EMSCRIPTEN 0 235ffd83dbSDimitry Andric #elif __APPLE__ 245ffd83dbSDimitry Andric #define LIBFUZZER_APPLE 1 255ffd83dbSDimitry Andric #define LIBFUZZER_FUCHSIA 0 265ffd83dbSDimitry Andric #define LIBFUZZER_LINUX 0 275ffd83dbSDimitry Andric #define LIBFUZZER_NETBSD 0 285ffd83dbSDimitry Andric #define LIBFUZZER_FREEBSD 0 295ffd83dbSDimitry Andric #define LIBFUZZER_WINDOWS 0 305ffd83dbSDimitry Andric #define LIBFUZZER_EMSCRIPTEN 0 315ffd83dbSDimitry Andric #elif __NetBSD__ 325ffd83dbSDimitry Andric #define LIBFUZZER_APPLE 0 335ffd83dbSDimitry Andric #define LIBFUZZER_FUCHSIA 0 345ffd83dbSDimitry Andric #define LIBFUZZER_LINUX 0 355ffd83dbSDimitry Andric #define LIBFUZZER_NETBSD 1 365ffd83dbSDimitry Andric #define LIBFUZZER_FREEBSD 0 375ffd83dbSDimitry Andric #define LIBFUZZER_WINDOWS 0 385ffd83dbSDimitry Andric #define LIBFUZZER_EMSCRIPTEN 0 395ffd83dbSDimitry Andric #elif __FreeBSD__ 405ffd83dbSDimitry Andric #define LIBFUZZER_APPLE 0 415ffd83dbSDimitry Andric #define LIBFUZZER_FUCHSIA 0 425ffd83dbSDimitry Andric #define LIBFUZZER_LINUX 0 435ffd83dbSDimitry Andric #define LIBFUZZER_NETBSD 0 445ffd83dbSDimitry Andric #define LIBFUZZER_FREEBSD 1 455ffd83dbSDimitry Andric #define LIBFUZZER_WINDOWS 0 465ffd83dbSDimitry Andric #define LIBFUZZER_EMSCRIPTEN 0 475ffd83dbSDimitry Andric #elif _WIN32 485ffd83dbSDimitry Andric #define LIBFUZZER_APPLE 0 495ffd83dbSDimitry Andric #define LIBFUZZER_FUCHSIA 0 505ffd83dbSDimitry Andric #define LIBFUZZER_LINUX 0 515ffd83dbSDimitry Andric #define LIBFUZZER_NETBSD 0 525ffd83dbSDimitry Andric #define LIBFUZZER_FREEBSD 0 535ffd83dbSDimitry Andric #define LIBFUZZER_WINDOWS 1 545ffd83dbSDimitry Andric #define LIBFUZZER_EMSCRIPTEN 0 555ffd83dbSDimitry Andric #elif __Fuchsia__ 565ffd83dbSDimitry Andric #define LIBFUZZER_APPLE 0 575ffd83dbSDimitry Andric #define LIBFUZZER_FUCHSIA 1 585ffd83dbSDimitry Andric #define LIBFUZZER_LINUX 0 595ffd83dbSDimitry Andric #define LIBFUZZER_NETBSD 0 605ffd83dbSDimitry Andric #define LIBFUZZER_FREEBSD 0 615ffd83dbSDimitry Andric #define LIBFUZZER_WINDOWS 0 625ffd83dbSDimitry Andric #define LIBFUZZER_EMSCRIPTEN 0 635ffd83dbSDimitry Andric #elif __EMSCRIPTEN__ 645ffd83dbSDimitry Andric #define LIBFUZZER_APPLE 0 655ffd83dbSDimitry Andric #define LIBFUZZER_FUCHSIA 0 665ffd83dbSDimitry Andric #define LIBFUZZER_LINUX 0 675ffd83dbSDimitry Andric #define LIBFUZZER_NETBSD 0 685ffd83dbSDimitry Andric #define LIBFUZZER_FREEBSD 0 695ffd83dbSDimitry Andric #define LIBFUZZER_WINDOWS 0 705ffd83dbSDimitry Andric #define LIBFUZZER_EMSCRIPTEN 1 715ffd83dbSDimitry Andric #else 725ffd83dbSDimitry Andric #error "Support for your platform has not been implemented" 735ffd83dbSDimitry Andric #endif 745ffd83dbSDimitry Andric 755ffd83dbSDimitry Andric #if defined(_MSC_VER) && !defined(__clang__) 765ffd83dbSDimitry Andric // MSVC compiler is being used. 775ffd83dbSDimitry Andric #define LIBFUZZER_MSVC 1 785ffd83dbSDimitry Andric #else 795ffd83dbSDimitry Andric #define LIBFUZZER_MSVC 0 805ffd83dbSDimitry Andric #endif 815ffd83dbSDimitry Andric 825ffd83dbSDimitry Andric #ifndef __has_attribute 835ffd83dbSDimitry Andric #define __has_attribute(x) 0 845ffd83dbSDimitry Andric #endif 855ffd83dbSDimitry Andric 865ffd83dbSDimitry Andric #define LIBFUZZER_POSIX \ 875ffd83dbSDimitry Andric (LIBFUZZER_APPLE || LIBFUZZER_LINUX || LIBFUZZER_NETBSD || \ 88e8d8bef9SDimitry Andric LIBFUZZER_FREEBSD || LIBFUZZER_EMSCRIPTEN) 895ffd83dbSDimitry Andric 90*13318055SDimitry Andric #if defined(__x86_64) && defined(__POPCNT__) 915ffd83dbSDimitry Andric #if __has_attribute(target) 925ffd83dbSDimitry Andric #define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt"))) 935ffd83dbSDimitry Andric #else 945ffd83dbSDimitry Andric #define ATTRIBUTE_TARGET_POPCNT 955ffd83dbSDimitry Andric #endif 965ffd83dbSDimitry Andric #else 975ffd83dbSDimitry Andric #define ATTRIBUTE_TARGET_POPCNT 985ffd83dbSDimitry Andric #endif 995ffd83dbSDimitry Andric 1005ffd83dbSDimitry Andric #ifdef __clang__ // avoid gcc warning. 1015ffd83dbSDimitry Andric #if __has_attribute(no_sanitize) 1025ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory"))) 1035ffd83dbSDimitry Andric #else 1045ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_MEMORY 1055ffd83dbSDimitry Andric #endif 1065ffd83dbSDimitry Andric #define ALWAYS_INLINE __attribute__((always_inline)) 1075ffd83dbSDimitry Andric #else 1085ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_MEMORY 1095ffd83dbSDimitry Andric #define ALWAYS_INLINE 1105ffd83dbSDimitry Andric #endif // __clang__ 1115ffd83dbSDimitry Andric 1125ffd83dbSDimitry Andric #if LIBFUZZER_WINDOWS 1135ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_ADDRESS 1145ffd83dbSDimitry Andric #else 1155ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) 1165ffd83dbSDimitry Andric #endif 1175ffd83dbSDimitry Andric 1185ffd83dbSDimitry Andric #if LIBFUZZER_WINDOWS 1195ffd83dbSDimitry Andric #define ATTRIBUTE_ALIGNED(X) __declspec(align(X)) 1205ffd83dbSDimitry Andric #define ATTRIBUTE_INTERFACE __declspec(dllexport) 1215ffd83dbSDimitry Andric // This is used for __sancov_lowest_stack which is needed for 1225ffd83dbSDimitry Andric // -fsanitize-coverage=stack-depth. That feature is not yet available on 1235ffd83dbSDimitry Andric // Windows, so make the symbol static to avoid linking errors. 1245ffd83dbSDimitry Andric #define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC static 1255ffd83dbSDimitry Andric #define ATTRIBUTE_NOINLINE __declspec(noinline) 1265ffd83dbSDimitry Andric #else 1275ffd83dbSDimitry Andric #define ATTRIBUTE_ALIGNED(X) __attribute__((aligned(X))) 1285ffd83dbSDimitry Andric #define ATTRIBUTE_INTERFACE __attribute__((visibility("default"))) 1295ffd83dbSDimitry Andric #define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC \ 1305ffd83dbSDimitry Andric ATTRIBUTE_INTERFACE __attribute__((tls_model("initial-exec"))) thread_local 1315ffd83dbSDimitry Andric 1325ffd83dbSDimitry Andric #define ATTRIBUTE_NOINLINE __attribute__((noinline)) 1335ffd83dbSDimitry Andric #endif 1345ffd83dbSDimitry Andric 1355ffd83dbSDimitry Andric #if defined(__has_feature) 1365ffd83dbSDimitry Andric #if __has_feature(address_sanitizer) 1375ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS 1385ffd83dbSDimitry Andric #elif __has_feature(memory_sanitizer) 1395ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY 1405ffd83dbSDimitry Andric #else 1415ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_ALL 1425ffd83dbSDimitry Andric #endif 1435ffd83dbSDimitry Andric #else 1445ffd83dbSDimitry Andric #define ATTRIBUTE_NO_SANITIZE_ALL 1455ffd83dbSDimitry Andric #endif 1465ffd83dbSDimitry Andric 1475ffd83dbSDimitry Andric #endif // LLVM_FUZZER_PLATFORM_H 148