mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Rather than directly using the extension `__builtin_expect`, use a macro to permit the removal of the builtin on compilers which do not support this (i.e. cl). This permits us to build the swift compiler with MSVC again.
177 lines
5.7 KiB
C++
177 lines
5.7 KiB
C++
//===--- Visibility.h - Visibility macros for runtime exports ---*- C++ -*-===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// These macros are used to declare symbols that should be exported from the
|
|
// Swift runtime.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SWIFT_STDLIB_SHIMS_VISIBILITY_H
|
|
#define SWIFT_STDLIB_SHIMS_VISIBILITY_H
|
|
|
|
#if !defined(__has_feature)
|
|
#define __has_feature(x) 0
|
|
#endif
|
|
|
|
#if !defined(__has_attribute)
|
|
#define __has_attribute(x) 0
|
|
#endif
|
|
|
|
#if !defined(__has_builtin)
|
|
#define __has_builtin(builtin) 0
|
|
#endif
|
|
|
|
#if __has_feature(nullability)
|
|
// Provide macros to temporarily suppress warning about the use of
|
|
// _Nullable and _Nonnull.
|
|
# define SWIFT_BEGIN_NULLABILITY_ANNOTATIONS \
|
|
_Pragma("clang diagnostic push") \
|
|
_Pragma("clang diagnostic ignored \"-Wnullability-extension\"")
|
|
# define SWIFT_END_NULLABILITY_ANNOTATIONS \
|
|
_Pragma("clang diagnostic pop")
|
|
|
|
#else
|
|
// #define _Nullable and _Nonnull to nothing if we're not being built
|
|
// with a compiler that supports them.
|
|
# define _Nullable
|
|
# define _Nonnull
|
|
# define SWIFT_BEGIN_NULLABILITY_ANNOTATIONS
|
|
# define SWIFT_END_NULLABILITY_ANNOTATIONS
|
|
#endif
|
|
|
|
#if __has_attribute(pure)
|
|
#define SWIFT_READONLY __attribute__((__pure__))
|
|
#else
|
|
#define SWIFT_READONLY
|
|
#endif
|
|
|
|
#if __has_attribute(const)
|
|
#define SWIFT_READNONE __attribute__((__const__))
|
|
#else
|
|
#define SWIFT_READNONE
|
|
#endif
|
|
|
|
#if __has_attribute(always_inline)
|
|
#define SWIFT_ALWAYS_INLINE __attribute__((always_inline))
|
|
#else
|
|
#define SWIFT_ALWAYS_INLINE
|
|
#endif
|
|
|
|
#if __has_attribute(unavailable)
|
|
#define SWIFT_ATTRIBUTE_UNAVAILABLE __attribute__((__unavailable__))
|
|
#else
|
|
#define SWIFT_ATTRIBUTE_UNAVAILABLE
|
|
#endif
|
|
|
|
// TODO: support using shims headers in overlays by parameterizing
|
|
// SWIFT_RUNTIME_EXPORT on the library it's exported from.
|
|
|
|
/// Attribute used to export symbols from the runtime.
|
|
#if defined(__MACH__)
|
|
|
|
# define SWIFT_EXPORT_ATTRIBUTE __attribute__((__visibility__("default")))
|
|
|
|
#elif defined(__ELF__)
|
|
|
|
// We make assumptions that the runtime and standard library can refer to each
|
|
// other's symbols as DSO-local, which means we can't allow the dynamic linker
|
|
// to relocate these symbols. We must give them protected visibility while
|
|
// building the standard library and runtime.
|
|
# if defined(swiftCore_EXPORTS)
|
|
# define SWIFT_EXPORT_ATTRIBUTE __attribute__((__visibility__("protected")))
|
|
# else
|
|
# define SWIFT_EXPORT_ATTRIBUTE __attribute__((__visibility__("default")))
|
|
# endif
|
|
|
|
// FIXME: this #else should be some sort of #elif Windows
|
|
#else // !__MACH__ && !__ELF__
|
|
|
|
# if defined(__CYGWIN__)
|
|
# define SWIFT_EXPORT_ATTRIBUTE
|
|
# else
|
|
|
|
# if defined(swiftCore_EXPORTS)
|
|
# define SWIFT_EXPORT_ATTRIBUTE __declspec(dllexport)
|
|
# else
|
|
# define SWIFT_EXPORT_ATTRIBUTE __declspec(dllimport)
|
|
# endif
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
#if defined(__cplusplus)
|
|
#define SWIFT_RUNTIME_EXPORT extern "C" SWIFT_EXPORT_ATTRIBUTE
|
|
#else
|
|
#define SWIFT_RUNTIME_EXPORT SWIFT_EXPORT_ATTRIBUTE
|
|
#endif
|
|
|
|
|
|
#ifndef SWIFT_GNUC_PREREQ
|
|
# if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
|
|
# define SWIFT_GNUC_PREREQ(maj, min, patch) \
|
|
((__GNUC__ << 20) + (__GNUC_MINOR__ << 10) + __GNUC_PATCHLEVEL__ >= \
|
|
((maj) << 20) + ((min) << 10) + (patch))
|
|
# elif defined(__GNUC__) && defined(__GNUC_MINOR__)
|
|
# define SWIFT_GNUC_PREREQ(maj, min, patch) \
|
|
((__GNUC__ << 20) + (__GNUC_MINOR__ << 10) >= ((maj) << 20) + ((min) << 10))
|
|
# else
|
|
# define SWIFT_GNUC_PREREQ(maj, min, patch) 0
|
|
# endif
|
|
#endif
|
|
|
|
/// Attributes for runtime-stdlib interfaces.
|
|
/// Use these for C implementations that are imported into Swift via SwiftShims
|
|
/// and for C implementations of Swift @_silgen_name declarations
|
|
/// Note that @_silgen_name implementations must also be marked SWIFT_CC(swift).
|
|
///
|
|
/// SWIFT_RUNTIME_STDLIB_API functions are called by compiler-generated code
|
|
/// or by @inlinable Swift code.
|
|
/// Such functions must be exported and must be supported forever as API.
|
|
/// The function name should be prefixed with `swift_`.
|
|
///
|
|
/// SWIFT_RUNTIME_STDLIB_SPI functions are called by overlay code.
|
|
/// Such functions must be exported, but are still SPI
|
|
/// and may be changed at any time.
|
|
/// The function name should be prefixed with `_swift_`.
|
|
///
|
|
/// SWIFT_RUNTIME_STDLIB_INTERNAL functions are called only by the stdlib.
|
|
/// Such functions are internal and are not exported.
|
|
#define SWIFT_RUNTIME_STDLIB_API SWIFT_RUNTIME_EXPORT
|
|
#define SWIFT_RUNTIME_STDLIB_SPI SWIFT_RUNTIME_EXPORT
|
|
|
|
// Match the definition of LLVM_LIBRARY_VISIBILITY from LLVM's
|
|
// Compiler.h. That header requires C++ and this needs to work in C.
|
|
#if (__has_attribute(visibility) || SWIFT_GNUC_PREREQ(4, 0, 0)) && \
|
|
!defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(_WIN32)
|
|
#define SWIFT_LIBRARY_VISIBILITY __attribute__ ((visibility("hidden")))
|
|
#else
|
|
#define SWIFT_LIBRARY_VISIBILITY
|
|
#endif
|
|
|
|
#if defined(__cplusplus)
|
|
#define SWIFT_RUNTIME_STDLIB_INTERNAL extern "C" SWIFT_LIBRARY_VISIBILITY
|
|
#else
|
|
#define SWIFT_RUNTIME_STDLIB_INTERNAL SWIFT_LIBRARY_VISIBILITY
|
|
#endif
|
|
|
|
#if __has_builtin(__builtin_expect)
|
|
#define SWIFT_LIKELY(expression) (__builtin_expect(!!(expression), 1))
|
|
#define SWIFT_UNLIKELY(expression) (__builtin_expect(!!(expression), 0))
|
|
#else
|
|
#define SWIFT_LIKELY(expression) ((expression))
|
|
#define SWIFT_UNLIKELY(expression) ((expression))
|
|
#endif
|
|
|
|
// SWIFT_STDLIB_SHIMS_VISIBILITY_H
|
|
#endif
|