15#ifndef LLVM_SUPPORT_COMPILER_H 
   16#define LLVM_SUPPORT_COMPILER_H 
   18#include "llvm/Config/llvm-config.h" 
   27# define __has_feature(x) 0 
   30#ifndef __has_extension 
   31# define __has_extension(x) 0 
   34#ifndef __has_attribute 
   35# define __has_attribute(x) 0 
   39# define __has_builtin(x) 0 
   43# define __has_warning(x) 0 
   48#ifndef LLVM_HAS_CPP_ATTRIBUTE 
   49#if defined(__cplusplus) && defined(__has_cpp_attribute) 
   50# define LLVM_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) 
   52# define LLVM_HAS_CPP_ATTRIBUTE(x) 0 
   59#ifndef LLVM_GNUC_PREREQ 
   60# if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) 
   61#  define LLVM_GNUC_PREREQ(maj, min, patch) \ 
   62    ((__GNUC__ << 20) + (__GNUC_MINOR__ << 10) + __GNUC_PATCHLEVEL__ >= \ 
   63     ((maj) << 20) + ((min) << 10) + (patch)) 
   64# elif defined(__GNUC__) && defined(__GNUC_MINOR__) 
   65#  define LLVM_GNUC_PREREQ(maj, min, patch) \ 
   66    ((__GNUC__ << 20) + (__GNUC_MINOR__ << 10) >= ((maj) << 20) + ((min) << 10)) 
   68#  define LLVM_GNUC_PREREQ(maj, min, patch) 0 
   94#define LLVM_MSC_PREREQ(version) (_MSC_VER >= (version)) 
   97#if !defined(LLVM_FORCE_USE_OLD_TOOLCHAIN) 
   98#if !LLVM_MSC_PREREQ(1920) 
   99#error LLVM requires at least VS 2019. 
  104#define LLVM_MSC_PREREQ(version) 0 
  117#if LLVM_HAS_CPP_ATTRIBUTE(gnu::visibility) && defined(__GNUC__) &&            \ 
  119#define LLVM_ATTRIBUTE_VISIBILITY_HIDDEN [[gnu::visibility("hidden")]] 
  120#define LLVM_ATTRIBUTE_VISIBILITY_DEFAULT [[gnu::visibility("default")]] 
  121#elif __has_attribute(visibility) 
  122#define LLVM_ATTRIBUTE_VISIBILITY_HIDDEN __attribute__((visibility("hidden"))) 
  123#define LLVM_ATTRIBUTE_VISIBILITY_DEFAULT __attribute__((visibility("default"))) 
  125#define LLVM_ATTRIBUTE_VISIBILITY_HIDDEN 
  126#define LLVM_ATTRIBUTE_VISIBILITY_DEFAULT 
  129#if defined(LLVM_BUILD_LLVM_DYLIB) || defined(LLVM_BUILD_SHARED_LIBS) 
  130#define LLVM_EXTERNAL_VISIBILITY LLVM_ATTRIBUTE_VISIBILITY_DEFAULT 
  132#define LLVM_EXTERNAL_VISIBILITY 
  135#if (!(defined(_WIN32) || defined(__CYGWIN__)) ||                              \ 
  136     ((defined(__MINGW32__) || defined(__CYGWIN__)) && defined(__clang__))) 
  137#define LLVM_LIBRARY_VISIBILITY LLVM_ATTRIBUTE_VISIBILITY_HIDDEN 
  140#if defined(__clang__) && __clang_major__ < 15 
  141#define LLVM_LIBRARY_VISIBILITY_NAMESPACE [[gnu::visibility("hidden")]] 
  143#define LLVM_LIBRARY_VISIBILITY_NAMESPACE LLVM_ATTRIBUTE_VISIBILITY_HIDDEN 
  145#define LLVM_ALWAYS_EXPORT LLVM_ATTRIBUTE_VISIBILITY_DEFAULT 
  147#define LLVM_ALWAYS_EXPORT __declspec(dllexport) 
  148#define LLVM_LIBRARY_VISIBILITY 
  149#define LLVM_LIBRARY_VISIBILITY_NAMESPACE 
  151#define LLVM_LIBRARY_VISIBILITY 
  152#define LLVM_ALWAYS_EXPORT 
  153#define LLVM_LIBRARY_VISIBILITY_NAMESPACE 
  179#ifndef LLVM_ABI_GENERATING_ANNOTATIONS 
  182#define LLVM_ABI_NOT_EXPORTED 
  185#if defined(LLVM_ENABLE_LLVM_EXPORT_ANNOTATIONS) && !defined(LLVM_BUILD_STATIC) 
  186#if defined(_WIN32) && !defined(__MINGW32__) 
  187#if defined(LLVM_EXPORTS) 
  188#define LLVM_ABI __declspec(dllexport) 
  189#define LLVM_TEMPLATE_ABI 
  190#define LLVM_EXPORT_TEMPLATE __declspec(dllexport) 
  192#define LLVM_ABI __declspec(dllimport) 
  193#define LLVM_TEMPLATE_ABI __declspec(dllimport) 
  194#define LLVM_EXPORT_TEMPLATE 
  196#define LLVM_ABI_EXPORT __declspec(dllexport) 
  197#elif __has_attribute(visibility) 
  198#if defined(__ELF__) || defined(__MINGW32__) || defined(_AIX) ||               \ 
  199    defined(__MVS__) || defined(__CYGWIN__) 
  200#define LLVM_ABI __attribute__((visibility("default"))) 
  201#define LLVM_TEMPLATE_ABI LLVM_ABI 
  202#define LLVM_EXPORT_TEMPLATE 
  203#define LLVM_ABI_EXPORT LLVM_ABI 
  204#elif defined(__MACH__) || defined(__WASM__) || defined(__EMSCRIPTEN__) 
  205#define LLVM_ABI __attribute__((visibility("default"))) 
  206#define LLVM_TEMPLATE_ABI 
  207#define LLVM_EXPORT_TEMPLATE 
  208#define LLVM_ABI_EXPORT LLVM_ABI 
  212#if !defined(LLVM_ABI) 
  214#define LLVM_TEMPLATE_ABI 
  215#define LLVM_EXPORT_TEMPLATE 
  216#define LLVM_ABI_EXPORT 
  218#define LLVM_ABI_FOR_TEST LLVM_ABI 
  222#define LLVM_PREFETCH(addr, rw, locality) __builtin_prefetch(addr, rw, locality) 
  224#define LLVM_PREFETCH(addr, rw, locality) 
  227#if __has_attribute(uninitialized) 
  228#define LLVM_ATTRIBUTE_UNINITIALIZED __attribute__((uninitialized)) 
  230#define LLVM_ATTRIBUTE_UNINITIALIZED 
  233#if __has_attribute(used) 
  234#define LLVM_ATTRIBUTE_USED __attribute__((__used__)) 
  236#define LLVM_ATTRIBUTE_USED 
  243#if defined(__clang__) && __has_attribute(retain) 
  244#define LLVM_ATTRIBUTE_RETAIN __attribute__((__retain__)) 
  246#define LLVM_ATTRIBUTE_RETAIN 
  249#if defined(__clang__) 
  250#define LLVM_DEPRECATED(MSG, FIX) __attribute__((deprecated(MSG, FIX))) 
  252#define LLVM_DEPRECATED(MSG, FIX) [[deprecated(MSG)]] 
  256#if defined(__clang__) || defined(__GNUC__) 
  257#define LLVM_SUPPRESS_DEPRECATED_DECLARATIONS_PUSH                             \ 
  258  _Pragma("GCC diagnostic push")                                               \ 
  259  _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") 
  260#define LLVM_SUPPRESS_DEPRECATED_DECLARATIONS_POP                              \ 
  261  _Pragma("GCC diagnostic pop") 
  262#elif defined(_MSC_VER) 
  263#define LLVM_SUPPRESS_DEPRECATED_DECLARATIONS_PUSH                             \ 
  264  _Pragma("warning(push)")                                                     \ 
  265  _Pragma("warning(disable : 4996)") 
  266#define LLVM_SUPPRESS_DEPRECATED_DECLARATIONS_POP                              \ 
  267  _Pragma("warning(pop)") 
  269#define LLVM_SUPPRESS_DEPRECATED_DECLARATIONS_PUSH 
  270#define LLVM_SUPPRESS_DEPRECATED_DECLARATIONS_POP 
  281#if LLVM_HAS_CPP_ATTRIBUTE(clang::reinitializes) 
  282#define LLVM_ATTRIBUTE_REINITIALIZES [[clang::reinitializes]] 
  284#define LLVM_ATTRIBUTE_REINITIALIZES 
  295#if __has_attribute(unused) 
  296#define LLVM_ATTRIBUTE_UNUSED __attribute__((__unused__)) 
  298#define LLVM_ATTRIBUTE_UNUSED 
  302#if __has_attribute(weak) && !defined(__MINGW32__) && !defined(__CYGWIN__) &&  \ 
  304#define LLVM_ATTRIBUTE_WEAK __attribute__((__weak__)) 
  306#define LLVM_ATTRIBUTE_WEAK 
  311#if defined(__clang__) || defined(__GNUC__) 
  313#define LLVM_READNONE __attribute__((__const__)) 
  318#if __has_attribute(pure) || defined(__GNUC__) 
  320#define LLVM_READONLY __attribute__((__pure__)) 
  325#if __has_attribute(minsize) 
  326#define LLVM_ATTRIBUTE_MINSIZE __attribute__((minsize)) 
  328#define LLVM_ATTRIBUTE_MINSIZE 
  331#if __has_builtin(__builtin_expect) || defined(__GNUC__) 
  332#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true) 
  333#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false) 
  335#define LLVM_LIKELY(EXPR) (EXPR) 
  336#define LLVM_UNLIKELY(EXPR) (EXPR) 
  341#if __has_attribute(noinline) 
  342#define LLVM_ATTRIBUTE_NOINLINE __attribute__((noinline)) 
  343#elif defined(_MSC_VER) 
  344#define LLVM_ATTRIBUTE_NOINLINE __declspec(noinline) 
  346#define LLVM_ATTRIBUTE_NOINLINE 
  351#if __has_attribute(always_inline) 
  352#define LLVM_ATTRIBUTE_ALWAYS_INLINE inline __attribute__((always_inline)) 
  353#elif defined(_MSC_VER) 
  354#define LLVM_ATTRIBUTE_ALWAYS_INLINE __forceinline 
  356#define LLVM_ATTRIBUTE_ALWAYS_INLINE inline 
  362#if __has_attribute(nodebug) 
  363#define LLVM_ATTRIBUTE_NODEBUG __attribute__((nodebug)) 
  365#define LLVM_ATTRIBUTE_NODEBUG 
  368#if __has_attribute(returns_nonnull) 
  369#define LLVM_ATTRIBUTE_RETURNS_NONNULL __attribute__((returns_nonnull)) 
  370#elif defined(_MSC_VER) 
  371#define LLVM_ATTRIBUTE_RETURNS_NONNULL _Ret_notnull_ 
  373#define LLVM_ATTRIBUTE_RETURNS_NONNULL 
  378#if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER) 
  379#define LLVM_ATTRIBUTE_RESTRICT __restrict 
  381#define LLVM_ATTRIBUTE_RESTRICT 
  387#define LLVM_ATTRIBUTE_RETURNS_NOALIAS __attribute__((__malloc__)) 
  388#elif defined(_MSC_VER) 
  389#define LLVM_ATTRIBUTE_RETURNS_NOALIAS __declspec(restrict) 
  391#define LLVM_ATTRIBUTE_RETURNS_NOALIAS 
  395#if defined(__cplusplus) && __cplusplus > 201402L && LLVM_HAS_CPP_ATTRIBUTE(fallthrough) 
  396#define LLVM_FALLTHROUGH [[fallthrough]] 
  397#elif LLVM_HAS_CPP_ATTRIBUTE(gnu::fallthrough) 
  398#define LLVM_FALLTHROUGH [[gnu::fallthrough]] 
  399#elif __has_attribute(fallthrough) 
  400#define LLVM_FALLTHROUGH __attribute__((fallthrough)) 
  401#elif LLVM_HAS_CPP_ATTRIBUTE(clang::fallthrough) 
  402#define LLVM_FALLTHROUGH [[clang::fallthrough]] 
  404#define LLVM_FALLTHROUGH 
  409#if LLVM_HAS_CPP_ATTRIBUTE(clang::require_constant_initialization) 
  410#define LLVM_REQUIRE_CONSTANT_INITIALIZATION                                   \ 
  411  [[clang::require_constant_initialization]] 
  413#define LLVM_REQUIRE_CONSTANT_INITIALIZATION 
  418#if LLVM_HAS_CPP_ATTRIBUTE(gsl::Owner) 
  419#define LLVM_GSL_OWNER [[gsl::Owner]] 
  421#define LLVM_GSL_OWNER 
  426#if LLVM_HAS_CPP_ATTRIBUTE(gsl::Pointer) 
  427#define LLVM_GSL_POINTER [[gsl::Pointer]] 
  429#define LLVM_GSL_POINTER 
  432#if LLVM_HAS_CPP_ATTRIBUTE(clang::lifetimebound) 
  433#define LLVM_LIFETIME_BOUND [[clang::lifetimebound]] 
  435#define LLVM_LIFETIME_BOUND 
  438#if LLVM_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L 
  439#define LLVM_CTOR_NODISCARD [[nodiscard]] 
  441#define LLVM_CTOR_NODISCARD 
  447#define LLVM_EXTENSION __extension__ 
  449#define LLVM_EXTENSION 
  459#if __has_builtin(__builtin_unreachable) || defined(__GNUC__) 
  460# define LLVM_BUILTIN_UNREACHABLE __builtin_unreachable() 
  461#elif defined(_MSC_VER) 
  462# define LLVM_BUILTIN_UNREACHABLE __assume(false) 
  467#if __has_builtin(__builtin_trap) || defined(__GNUC__) 
  468# define LLVM_BUILTIN_TRAP __builtin_trap() 
  469#elif defined(_MSC_VER) 
  474# define LLVM_BUILTIN_TRAP __debugbreak() 
  476# define LLVM_BUILTIN_TRAP *(volatile int*)0x11 = 0 
  482#if __has_builtin(__builtin_debugtrap) 
  483# define LLVM_BUILTIN_DEBUGTRAP __builtin_debugtrap() 
  484#elif defined(_MSC_VER) 
  488# define LLVM_BUILTIN_DEBUGTRAP __debugbreak() 
  493# define LLVM_BUILTIN_DEBUGTRAP 
  498#if __has_builtin(__builtin_assume_aligned) || defined(__GNUC__) 
  499# define LLVM_ASSUME_ALIGNED(p, a) __builtin_assume_aligned(p, a) 
  500#elif defined(LLVM_BUILTIN_UNREACHABLE) 
  501# define LLVM_ASSUME_ALIGNED(p, a) \ 
  502           (((uintptr_t(p) % (a)) == 0) ? (p) : (LLVM_BUILTIN_UNREACHABLE, (p))) 
  504# define LLVM_ASSUME_ALIGNED(p, a) (p) 
  526# define LLVM_PACKED(d) __pragma(pack(push, 1)) d __pragma(pack(pop)) 
  527# define LLVM_PACKED_START __pragma(pack(push, 1)) 
  528# define LLVM_PACKED_END   __pragma(pack(pop)) 
  530# define LLVM_PACKED(d) d __attribute__((packed)) 
  531# define LLVM_PACKED_START _Pragma("pack(push, 1)") 
  532# define LLVM_PACKED_END   _Pragma("pack(pop)") 
  537#if __has_feature(memory_sanitizer) 
  538# define LLVM_MEMORY_SANITIZER_BUILD 1 
  539# include <sanitizer/msan_interface.h> 
  540# define LLVM_NO_SANITIZE_MEMORY_ATTRIBUTE __attribute__((no_sanitize_memory)) 
  542# define LLVM_MEMORY_SANITIZER_BUILD 0 
  543# define __msan_allocated_memory(p, size) 
  544# define __msan_unpoison(p, size) 
  545# define LLVM_NO_SANITIZE_MEMORY_ATTRIBUTE 
  550#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) 
  551# define LLVM_ADDRESS_SANITIZER_BUILD 1 
  552#if __has_include(<sanitizer/asan_interface.h>) 
  553# include <sanitizer/asan_interface.h> 
  567# define LLVM_ADDRESS_SANITIZER_BUILD 0 
  568# define __asan_poison_memory_region(p, size) 
  569# define __asan_unpoison_memory_region(p, size) 
  574#if __has_feature(hwaddress_sanitizer) 
  575#define LLVM_HWADDRESS_SANITIZER_BUILD 1 
  577#define LLVM_HWADDRESS_SANITIZER_BUILD 0 
  582#if __has_feature(thread_sanitizer) || defined(__SANITIZE_THREAD__) 
  583# define LLVM_THREAD_SANITIZER_BUILD 1 
  585# define LLVM_THREAD_SANITIZER_BUILD 0 
  588#if LLVM_THREAD_SANITIZER_BUILD 
  595void AnnotateHappensAfter(
const char *
file, 
int line, 
const volatile void *cv);
 
  596void AnnotateHappensBefore(
const char *
file, 
int line, 
const volatile void *cv);
 
  597void AnnotateIgnoreWritesBegin(
const char *
file, 
int line);
 
  598void AnnotateIgnoreWritesEnd(
const char *
file, 
int line);
 
  606# define TsanHappensBefore(cv) AnnotateHappensBefore(__FILE__, __LINE__, cv) 
  609# define TsanHappensAfter(cv) AnnotateHappensAfter(__FILE__, __LINE__, cv) 
  612# define TsanIgnoreWritesBegin() AnnotateIgnoreWritesBegin(__FILE__, __LINE__) 
  615# define TsanIgnoreWritesEnd() AnnotateIgnoreWritesEnd(__FILE__, __LINE__) 
  617# define TsanHappensBefore(cv) 
  618# define TsanHappensAfter(cv) 
  619# define TsanIgnoreWritesBegin() 
  620# define TsanIgnoreWritesEnd() 
  625#if __has_attribute(no_sanitize) 
  626#define LLVM_NO_SANITIZE(KIND) __attribute__((no_sanitize(KIND))) 
  628#define LLVM_NO_SANITIZE(KIND) 
  637#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 
  638#define LLVM_DUMP_METHOD                                                       \ 
  639  LLVM_ATTRIBUTE_NOINLINE LLVM_ATTRIBUTE_USED LLVM_ATTRIBUTE_RETAIN 
 
  641#define LLVM_DUMP_METHOD LLVM_ATTRIBUTE_NOINLINE 
  650#define LLVM_PRETTY_FUNCTION __FUNCSIG__ 
  651#elif defined(__GNUC__) || defined(__clang__) 
  652#define LLVM_PRETTY_FUNCTION __PRETTY_FUNCTION__ 
  654#define LLVM_PRETTY_FUNCTION __func__ 
  668#if LLVM_ENABLE_THREADS 
  669#if __has_feature(cxx_thread_local) || defined(_MSC_VER) 
  670#define LLVM_THREAD_LOCAL thread_local 
  674#define LLVM_THREAD_LOCAL __thread 
  679#define LLVM_THREAD_LOCAL 
  684#if __has_feature(cxx_exceptions) 
  685#define LLVM_ENABLE_EXCEPTIONS 1 
  686#elif defined(__GNUC__) && defined(__EXCEPTIONS) 
  687#define LLVM_ENABLE_EXCEPTIONS 1 
  688#elif defined(_MSC_VER) && defined(_CPPUNWIND) 
  689#define LLVM_ENABLE_EXCEPTIONS 1 
  694#if __has_attribute(no_profile_instrument_function) 
  695#define LLVM_NO_PROFILE_INSTRUMENT_FUNCTION                                    \ 
  696  __attribute__((no_profile_instrument_function)) 
  698#define LLVM_NO_PROFILE_INSTRUMENT_FUNCTION 
  703#if __has_attribute(preferred_type) 
  704#define LLVM_PREFERRED_TYPE(T) __attribute__((preferred_type(T))) 
  706#define LLVM_PREFERRED_TYPE(T) 
  709#if LLVM_HAS_CPP_ATTRIBUTE(clang::ptrauth_vtable_pointer) &&                   \ 
  710    (defined(__PTRAUTH__) || __has_feature(ptrauth_calls)) 
  711#define LLVM_MOVABLE_POLYMORPHIC_TYPE                                          \ 
  712  [[clang::ptrauth_vtable_pointer(default_key, no_address_discrimination,      \ 
  713                                  default_extra_discrimination)]] 
  715#define LLVM_MOVABLE_POLYMORPHIC_TYPE 
  724#if defined(__clang__) 
  726  #if __has_warning("-Wunnecessary-virtual-specifier") 
  727    #define LLVM_DECLARE_VIRTUAL_ANCHOR_FUNCTION()                            \ 
  728      _Pragma("clang diagnostic push")                                        \ 
  729      _Pragma("clang diagnostic ignored \"-Wunnecessary-virtual-specifier\"") \ 
  730      virtual void anchor()                                                   \ 
  731      _Pragma("clang diagnostic pop") 
  733    #define LLVM_DECLARE_VIRTUAL_ANCHOR_FUNCTION()                            \ 
  734      virtual void anchor() 
  737  #define LLVM_DECLARE_VIRTUAL_ANCHOR_FUNCTION()                              \ 
  738    virtual void anchor() 
 
#define __asan_poison_memory_region(p, size)
#define __asan_unpoison_memory_region(p, size)
dot regions Print regions of function to dot file(with no function bodies)"