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