llvm/compiler-rt/lib/fuzzer/FuzzerPlatform.h

//===-- FuzzerPlatform.h --------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// Common platform macros.
//===----------------------------------------------------------------------===//

#ifndef LLVM_FUZZER_PLATFORM_H
#define LLVM_FUZZER_PLATFORM_H

// Platform detection.
#ifdef __linux__
#define LIBFUZZER_APPLE
#define LIBFUZZER_FUCHSIA
#define LIBFUZZER_LINUX
#define LIBFUZZER_NETBSD
#define LIBFUZZER_FREEBSD
#define LIBFUZZER_WINDOWS
#define LIBFUZZER_EMSCRIPTEN
#elif __APPLE__
#define LIBFUZZER_APPLE
#define LIBFUZZER_FUCHSIA
#define LIBFUZZER_LINUX
#define LIBFUZZER_NETBSD
#define LIBFUZZER_FREEBSD
#define LIBFUZZER_WINDOWS
#define LIBFUZZER_EMSCRIPTEN
#elif __NetBSD__
#define LIBFUZZER_APPLE
#define LIBFUZZER_FUCHSIA
#define LIBFUZZER_LINUX
#define LIBFUZZER_NETBSD
#define LIBFUZZER_FREEBSD
#define LIBFUZZER_WINDOWS
#define LIBFUZZER_EMSCRIPTEN
#elif __FreeBSD__
#define LIBFUZZER_APPLE
#define LIBFUZZER_FUCHSIA
#define LIBFUZZER_LINUX
#define LIBFUZZER_NETBSD
#define LIBFUZZER_FREEBSD
#define LIBFUZZER_WINDOWS
#define LIBFUZZER_EMSCRIPTEN
#elif _WIN32
#define LIBFUZZER_APPLE
#define LIBFUZZER_FUCHSIA
#define LIBFUZZER_LINUX
#define LIBFUZZER_NETBSD
#define LIBFUZZER_FREEBSD
#define LIBFUZZER_WINDOWS
#define LIBFUZZER_EMSCRIPTEN
#elif __Fuchsia__
#define LIBFUZZER_APPLE
#define LIBFUZZER_FUCHSIA
#define LIBFUZZER_LINUX
#define LIBFUZZER_NETBSD
#define LIBFUZZER_FREEBSD
#define LIBFUZZER_WINDOWS
#define LIBFUZZER_EMSCRIPTEN
#elif __EMSCRIPTEN__
#define LIBFUZZER_APPLE
#define LIBFUZZER_FUCHSIA
#define LIBFUZZER_LINUX
#define LIBFUZZER_NETBSD
#define LIBFUZZER_FREEBSD
#define LIBFUZZER_WINDOWS
#define LIBFUZZER_EMSCRIPTEN
#else
#error "Support for your platform has not been implemented"
#endif

#if defined(_MSC_VER) && !defined(__clang__)
// MSVC compiler is being used.
#define LIBFUZZER_MSVC
#else
#define LIBFUZZER_MSVC
#endif

#ifndef __has_attribute
#define __has_attribute
#endif

#define LIBFUZZER_POSIX

#ifdef __x86_64
#if __has_attribute(target)
#define ATTRIBUTE_TARGET_POPCNT
#else
#define ATTRIBUTE_TARGET_POPCNT
#endif
#else
#define ATTRIBUTE_TARGET_POPCNT
#endif

#ifdef __clang__ // avoid gcc warning.
#if __has_attribute(no_sanitize)
#define ATTRIBUTE_NO_SANITIZE_MEMORY
#else
#define ATTRIBUTE_NO_SANITIZE_MEMORY
#endif
#define ALWAYS_INLINE
#else
#define ATTRIBUTE_NO_SANITIZE_MEMORY
#define ALWAYS_INLINE
#endif // __clang__

#if LIBFUZZER_WINDOWS
#define ATTRIBUTE_NO_SANITIZE_ADDRESS
#else
#define ATTRIBUTE_NO_SANITIZE_ADDRESS
#endif

#if LIBFUZZER_WINDOWS
#define ATTRIBUTE_ALIGNED
#define ATTRIBUTE_INTERFACE
// This is used for __sancov_lowest_stack which is needed for
// -fsanitize-coverage=stack-depth. That feature is not yet available on
// Windows, so make the symbol static to avoid linking errors.
#define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC
#define ATTRIBUTE_NOINLINE
#else
#define ATTRIBUTE_ALIGNED(X)
#define ATTRIBUTE_INTERFACE
#define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC

#define ATTRIBUTE_NOINLINE
#endif

#if defined(__has_feature)
#if __has_feature(address_sanitizer)
#define ATTRIBUTE_NO_SANITIZE_ALL
#elif __has_feature(memory_sanitizer)
#define ATTRIBUTE_NO_SANITIZE_ALL
#else
#define ATTRIBUTE_NO_SANITIZE_ALL
#endif
#else
#define ATTRIBUTE_NO_SANITIZE_ALL
#endif

#endif // LLVM_FUZZER_PLATFORM_H