xref: /freebsd-src/contrib/llvm-project/compiler-rt/lib/fuzzer/FuzzerPlatform.h (revision 133180557479cd9676758e6f3f93a9d3e1c6b532)
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