Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-15 09:17:18

0001 /*   $Source: bitbucket.org:berkeleylab/gasnet.git/other/portable_platform.h $
0002  * Description: Portable platform detection header
0003  * Copyright 2006, Dan Bonachea 
0004  * Copyright 2018, The Regents of the University of California
0005  * Terms of Use: In ADDITION to the license information in license.txt, 
0006  *  anyone redistributing this header agrees not to change any part of this notice, or
0007  *  the version handshake in the header versioning section below. 
0008  *  Furthermore, redistributed copies of any portion of this header must
0009  *  not appear within files named "portable_platform.h" or "gasnet_portable_platform.h",
0010  *  unless it is embedded within a complete copy of the GASNet distribution.
0011  *  These restrictions are designed to prevent conflicts for end users 
0012  *  who compose multiple projects using the PLATFORM_ namespace.
0013  *
0014  * The canonical version of this header is hosted in the GASNet project at:
0015  *   https://bitbucket.org/berkeleylab/gasnet   
0016  *
0017  * Developers who clone this header into their own project are HIGHLY encouraged to  
0018  * contribute any improvements (especially addition of new platforms) back to the 
0019  * canonical version, for the benefit of the community. 
0020  * Contributions and bug reports should be directed to:
0021  *   https://gasnet-bugs.lbl.gov or gasnet-staff@lbl.gov
0022  */
0023 /* ------------------------------------------------------------------------------------ */
0024 /* Header versioning: DO NOT CHANGE ANYTHING IN THIS SECTION 
0025  * The license terms for this header prohibit modifying this section in ANY way.
0026    Clones should continue to advertise a PLATFORM_HEADER_VERSION equal to the canonical version they cloned,
0027    and should not modify the handshake logic which ensures the highest canonical header version is used.
0028  */
0029 /* Publish and enforce version number for the public interface to this header */
0030 /* YOU ARE NOT PERMITTED TO CHANGE THIS SECTION WITHOUT DIRECT APPROVAL FROM DAN BONACHEA */
0031 #if !defined(_PORTABLE_PLATFORM_H) || !defined(PLATFORM_HEADER_VERSION) \
0032      || _PORTABLE_PLATFORM_H != PLATFORM_HEADER_VERSION \
0033      || PLATFORM_HEADER_VERSION < 22
0034 #undef  PLATFORM_HEADER_VERSION 
0035 #define PLATFORM_HEADER_VERSION 22
0036 #undef  _PORTABLE_PLATFORM_H
0037 #define _PORTABLE_PLATFORM_H PLATFORM_HEADER_VERSION
0038 /* End Header versioning handshake */
0039 /* ------------------------------------------------------------------------------------ */
0040 
0041 /* make sure that previously-included older/broken clones of this header do not pollute our namespace */
0042 #undef PLATFORM_COMPILER_FAMILYNAME
0043 #undef PLATFORM_COMPILER_FAMILYID
0044 #undef PLATFORM_COMPILER_ID
0045 #undef PLATFORM_COMPILER_VERSION
0046 #undef PLATFORM_COMPILER_VERSION_STR
0047 #undef PLATFORM_COMPILER_VERSION_INT
0048 #undef PLATFORM_COMPILER_IDSTR
0049 #undef PLATFORM_COMPILER_VERSION_GT
0050 #undef PLATFORM_COMPILER_VERSION_GE
0051 #undef PLATFORM_COMPILER_VERSION_EQ
0052 #undef PLATFORM_COMPILER_VERSION_LE
0053 #undef PLATFORM_COMPILER_VERSION_LT
0054 #undef PLATFORM_COMPILER_C_LANGLVL
0055 #undef PLATFORM_COMPILER_CXX_LANGLVL
0056 #undef PLATFORM_COMPILER_INTEL
0057 #undef PLATFORM_COMPILER_INTEL_C
0058 #undef PLATFORM_COMPILER_INTEL_CXX
0059 #undef PLATFORM_COMPILER_PATHSCALE
0060 #undef PLATFORM_COMPILER_PATHSCALE_C
0061 #undef PLATFORM_COMPILER_PATHSCALE_CXX
0062 #undef PLATFORM_COMPILER_PGI
0063 #undef PLATFORM_COMPILER_PGI_C
0064 #undef PLATFORM_COMPILER_PGI_CXX
0065 #undef PLATFORM_COMPILER_XLC
0066 #undef PLATFORM_COMPILER_XLC_C
0067 #undef PLATFORM_COMPILER_XLC_CXX
0068 #undef PLATFORM_COMPILER_COMPAQ
0069 #undef PLATFORM_COMPILER_COMPAQ_C
0070 #undef PLATFORM_COMPILER_COMPAQ_CXX
0071 #undef PLATFORM_COMPILER_SUN
0072 #undef PLATFORM_COMPILER_SUN_C
0073 #undef PLATFORM_COMPILER_SUN_CXX
0074 #undef PLATFORM_COMPILER_HP
0075 #undef PLATFORM_COMPILER_HP_C
0076 #undef PLATFORM_COMPILER_HP_CXX
0077 #undef PLATFORM_COMPILER_SGI
0078 #undef PLATFORM_COMPILER_SGI_C
0079 #undef PLATFORM_COMPILER_SGI_CXX
0080 #undef PLATFORM_COMPILER_CRAY
0081 #undef PLATFORM_COMPILER_CRAY_C
0082 #undef PLATFORM_COMPILER_CRAY_CXX
0083 #undef PLATFORM_COMPILER_KAI
0084 #undef PLATFORM_COMPILER_KAI_C
0085 #undef PLATFORM_COMPILER_KAI_CXX
0086 #undef PLATFORM_COMPILER_MTA
0087 #undef PLATFORM_COMPILER_MTA_C
0088 #undef PLATFORM_COMPILER_MTA_CXX
0089 #undef PLATFORM_COMPILER_NECSX
0090 #undef PLATFORM_COMPILER_NECSX_C
0091 #undef PLATFORM_COMPILER_NECSX_CXX
0092 #undef PLATFORM_COMPILER_MICROSOFT
0093 #undef PLATFORM_COMPILER_MICROSOFT_C
0094 #undef PLATFORM_COMPILER_MICROSOFT_CXX
0095 #undef PLATFORM_COMPILER_TINY
0096 #undef PLATFORM_COMPILER_TINY_C
0097 #undef PLATFORM_COMPILER_TINY_CXX
0098 #undef PLATFORM_COMPILER_LCC
0099 #undef PLATFORM_COMPILER_LCC_C
0100 #undef PLATFORM_COMPILER_LCC_CXX
0101 #undef PLATFORM_COMPILER_OPEN64
0102 #undef PLATFORM_COMPILER_OPEN64_C
0103 #undef PLATFORM_COMPILER_OPEN64_CXX
0104 #undef PLATFORM_COMPILER_PCC
0105 #undef PLATFORM_COMPILER_PCC_C
0106 #undef PLATFORM_COMPILER_PCC_CXX
0107 #undef PLATFORM_COMPILER_CLANG
0108 #undef PLATFORM_COMPILER_CLANG_C
0109 #undef PLATFORM_COMPILER_CLANG_CXX
0110 #undef PLATFORM_COMPILER_NVHPC
0111 #undef PLATFORM_COMPILER_NVHPC_C
0112 #undef PLATFORM_COMPILER_NVHPC_CXX
0113 #undef PLATFORM_COMPILER_GNU
0114 #undef PLATFORM_COMPILER_GNU_C
0115 #undef PLATFORM_COMPILER_GNU_CXX
0116 #undef PLATFORM_COMPILER_UNKNOWN
0117 
0118 #undef PLATFORM_OS_FAMILYNAME
0119 #undef PLATFORM_OS_SUBFAMILYNAME
0120 #undef PLATFORM_OS_CATAMOUNT
0121 #undef PLATFORM_OS_BGP
0122 #undef PLATFORM_OS_BGQ
0123 #undef PLATFORM_OS_K42
0124 #undef PLATFORM_OS_UCLINUX
0125 #undef PLATFORM_OS_LINUX
0126 #undef PLATFORM_OS_CNL
0127 #undef PLATFORM_OS_SUBFAMILY_CNL
0128 #undef PLATFORM_OS_WSL
0129 #undef PLATFORM_OS_SUBFAMILY_WSL
0130 #undef PLATFORM_OS_BLRTS
0131 #undef PLATFORM_OS_CYGWIN
0132 #undef PLATFORM_OS_MSWINDOWS
0133 #undef PLATFORM_OS_AIX
0134 #undef PLATFORM_OS_TRU64
0135 #undef PLATFORM_OS_FREEBSD
0136 #undef PLATFORM_OS_NETBSD
0137 #undef PLATFORM_OS_OPENBSD
0138 #undef PLATFORM_OS_SOLARIS
0139 #undef PLATFORM_OS_DARWIN
0140 #undef PLATFORM_OS_IRIX
0141 #undef PLATFORM_OS_HPUX
0142 #undef PLATFORM_OS_UNICOS
0143 #undef PLATFORM_OS_MTA
0144 #undef PLATFORM_OS_SUPERUX
0145 #undef PLATFORM_OS_UNKNOWN
0146 
0147 #undef PLATFORM_ARCH_FAMILYNAME
0148 #undef PLATFORM_ARCH_32
0149 #undef _PLATFORM_ARCH_32
0150 #undef PLATFORM_ARCH_64
0151 #undef _PLATFORM_ARCH_64
0152 #undef PLATFORM_ARCH_BIG_ENDIAN
0153 #undef _PLATFORM_ARCH_BIG_ENDIAN
0154 #undef PLATFORM_ARCH_LITTLE_ENDIAN
0155 #undef _PLATFORM_ARCH_LITTLE_ENDIAN
0156 #undef PLATFORM_ARCH_POWERPC
0157 #undef PLATFORM_ARCH_MIC
0158 #undef PLATFORM_ARCH_X86_64
0159 #undef PLATFORM_ARCH_IA64
0160 #undef PLATFORM_ARCH_X86
0161 #undef PLATFORM_ARCH_ALPHA
0162 #undef PLATFORM_ARCH_MIPS
0163 #undef PLATFORM_ARCH_SPARC
0164 #undef PLATFORM_ARCH_PARISC
0165 #undef PLATFORM_ARCH_CRAYX1
0166 #undef PLATFORM_ARCH_CRAYT3E
0167 #undef PLATFORM_ARCH_MTA
0168 #undef PLATFORM_ARCH_NECSX
0169 #undef PLATFORM_ARCH_MICROBLAZE
0170 #undef PLATFORM_ARCH_ARM
0171 #undef PLATFORM_ARCH_AARCH64
0172 #undef PLATFORM_ARCH_TILE
0173 #undef PLATFORM_ARCH_S390
0174 #undef PLATFORM_ARCH_RISCV
0175 #undef PLATFORM_ARCH_UNKNOWN
0176 
0177 /* prevent known old/broken versions of this header from loading */
0178 #undef  OMPI_PORTABLE_PLATFORM_H
0179 #define OMPI_PORTABLE_PLATFORM_H
0180 #undef  OPAL_PORTABLE_PLATFORM_H
0181 #define OPAL_PORTABLE_PLATFORM_H
0182 
0183 /* ------------------------------------------------------------------------------------ */
0184 /* most of this file was written based on information in vendor documents, system headers,
0185    and inspecting verbose compiler output. 
0186    Another useful source of information: http://predef.sourceforge.net/
0187 */
0188 
0189 /* ------------------------------------------------------------------------------------ */
0190 /* helpers */
0191 
0192 #undef  _PLATFORM_STRINGIFY_HELPER
0193 #define _PLATFORM_STRINGIFY_HELPER(x) #x
0194 #undef  PLATFORM_STRINGIFY
0195 #define PLATFORM_STRINGIFY(x) _PLATFORM_STRINGIFY_HELPER(x)
0196 
0197 /* ------------------------------------------------------------------------------------ */
0198 /* Compiler detection */
0199 /* 
0200   PLATFORM_COMPILER_<family>:
0201      defined to 1 if compiler is a given family, undef otherwise
0202   PLATFORM_COMPILER_<family>_C
0203   PLATFORM_COMPILER_<family>_CXX
0204      defined to 1 if compiler is a given family, and is the C or C++ compiler, respectively
0205   PLATFORM_COMPILER_FAMILYNAME:
0206      unquoted token which provides the compiler family name
0207   PLATFORM_COMPILER_FAMILYID:
0208      defined to a positive integral value which is unique to a given compiler family
0209      or zero if the compiler is unrecognized
0210   PLATFORM_COMPILER_ID:
0211      same as PLATFORM_COMPILER_FAMILYID, except C and C++ compilers are differentiated
0212   PLATFORM_COMPILER_VERSION:
0213      defined to an integral expression which is guaranteed to be monotonically non-decreasing 
0214      with increasing compiler versions. Will be zero for unrecognized compilers.
0215      The exact encoding of compiler version tuples into this constant may occasionally
0216      change when this header is upgraded, so code should use the (in)equality macros below
0217      to check against particular compiler versions, instead of embedding an encoded constant.
0218   PLATFORM_COMPILER_VERSION_STR:
0219      A string representation of the compiler version, which may contain additional info
0220   PLATFORM_COMPILER_VERSION_[GT,GE,EQ,LE,LT](maj,min,pat):
0221      evaluate to non-zero iff the compiler version in use is respectively 
0222      greater-than, greater-or-equal, equal, less-or-equal, less-than 
0223      the provided version components
0224   PLATFORM_COMPILER_IDSTR:
0225      a string which uniquely identifies recognized compilers
0226   PLATFORM_COMPILER_C_LANGLVL and PLATFORM_COMPILER_CXX_LANGLVL: (in PLATFORM_HEADER_VERSION >= 5)
0227      defined to a positive integral value corresponding to the C or C++ (respectively) 
0228      language standard to which the current compiler advertises conformance.
0229      Otherwise undef (in particular at most one of these is defined in a given compilation).
0230 */
0231 
0232 #if defined(__INTEL_COMPILER)
0233   #define PLATFORM_COMPILER_INTEL  1
0234   #define PLATFORM_COMPILER_FAMILYNAME INTEL
0235   #define PLATFORM_COMPILER_FAMILYID 2
0236   #ifdef __cplusplus
0237     #define PLATFORM_COMPILER_INTEL_CXX  1
0238   #else
0239     #define PLATFORM_COMPILER_INTEL_C  1
0240   #endif
0241   /* Intel compiler version "patch number"
0242    * -------------------------------------
0243    * Intel compiler versioning is unfortunately complicated by behavioral changes.
0244    * Versions prior to Intel 14.0.0 (Sept 2013) lacked a preprocessor symbol to supply the "update" number.
0245    * Version 14.0.0 and later supply a __INTEL_COMPILER_UPDATE symbol, but sadly several releases of Version 19 
0246    * report the wrong value in this field (bug 3876).
0247    * For now, the "patch" field of the PLATFORM_COMPILER_VERSION for Intel is the release package BUILD DATE,
0248    * in the same decimal YYYYMMDD format as __INTEL_COMPILER_BUILD_DATE, as this is the only indicator that has
0249    * remained reliably stable/correct across versions. 
0250    * So for example to check for icc --version "19.0.1.144 20181018" or later, pass:
0251    *   PLATFORM_COMPILER_VERSION_GE(19, 0, 20181018)
0252    * NOTE 1: this build-date is unfortunately OS-DEPENDENT, sometimes differing by several days or weeks 
0253    * between the Linux and OSX releases. For a complete mapping, see:
0254    * https://software.intel.com/en-us/articles/intel-compiler-and-composer-update-version-numbers-to-compiler-version-number-mapping
0255    * NOTE 2: some of the build-date entries in the table linked above have been observed to be incorrect,
0256    * so when possible it's safest to verify the build-date from `icc --version` on both Linux and macOS.
0257    */
0258   #undef  _PLATFORM_INTEL_COMPILER_BUILD_DATE
0259   #undef  _PLATFORM_COMPILER_INTEL_MIN_BUILDDATE
0260   #define _PLATFORM_COMPILER_INTEL_MIN_BUILDDATE 19900000 /* year 1990: corresponds roughly to Intel v4.5 (1992) */
0261   /* MIN_BUILDDATE is used to normalize build dates to a bit-saving range for the encoding
0262    * Intel officially supports the current release and two prior (currently back to 2016)
0263    * Our 1990 floor corresponds to Intel v4.x that only worked on MS-DOS and predates both Linux and BSD-based macOS
0264    */
0265   #ifdef __INTEL_COMPILER_BUILD_DATE
0266     #define _PLATFORM_INTEL_COMPILER_BUILD_DATE __INTEL_COMPILER_BUILD_DATE
0267   #else
0268     #define _PLATFORM_INTEL_COMPILER_BUILD_DATE _PLATFORM_COMPILER_INTEL_MIN_BUILDDATE
0269   #endif
0270   /* Intel patch number is a decimal build date: YYYYMMDD - do NOT pass the "update number" */
0271   #define PLATFORM_COMPILER_VERSION_INT(maj,min,pat)         \
0272         (((((maj) * 100) + (min)) << 19) |                    \
0273            ((pat) < _PLATFORM_COMPILER_INTEL_MIN_BUILDDATE ? \
0274              0 : ((pat)-_PLATFORM_COMPILER_INTEL_MIN_BUILDDATE)))
0275   #undef _PLATFORM__INTEL_COMPILER
0276   #if __INTEL_COMPILER == 9999  /* Seen in 20110811 release of 12.1.0 - overflows VERSION_INT() */
0277     #define _PLATFORM__INTEL_COMPILER 1201
0278   #else
0279     #define _PLATFORM__INTEL_COMPILER __INTEL_COMPILER
0280   #endif
0281   #define PLATFORM_COMPILER_VERSION \
0282           PLATFORM_COMPILER_VERSION_INT(_PLATFORM__INTEL_COMPILER/100, _PLATFORM__INTEL_COMPILER%100, _PLATFORM_INTEL_COMPILER_BUILD_DATE)
0283   #define PLATFORM_COMPILER_VERSION_STR \
0284           PLATFORM_STRINGIFY(_PLATFORM__INTEL_COMPILER) "." PLATFORM_STRINGIFY(_PLATFORM_INTEL_COMPILER_BUILD_DATE)
0285 
0286 #elif defined(__PATHSCALE__)
0287   #define PLATFORM_COMPILER_PATHSCALE  1
0288   #define PLATFORM_COMPILER_FAMILYNAME PATHSCALE
0289   #define PLATFORM_COMPILER_FAMILYID 3
0290   #ifdef __cplusplus
0291     #define PLATFORM_COMPILER_PATHSCALE_CXX  1
0292   #else
0293     #define PLATFORM_COMPILER_PATHSCALE_C  1
0294   #endif
0295   #define PLATFORM_COMPILER_VERSION \
0296           PLATFORM_COMPILER_VERSION_INT(__PATHCC__,__PATHCC_MINOR__,__PATHCC_PATCHLEVEL__+0)
0297   #define PLATFORM_COMPILER_VERSION_STR __PATHSCALE__
0298 
0299 #elif defined(__NVCOMPILER) /* Must occur prior to PGI and CLANG */
0300   #define PLATFORM_COMPILER_NVHPC  1
0301   #define PLATFORM_COMPILER_FAMILYNAME NVHPC
0302   #define PLATFORM_COMPILER_FAMILYID 20
0303   #ifdef __cplusplus
0304     #define PLATFORM_COMPILER_NVHPC_CXX  1
0305   #else
0306     #define PLATFORM_COMPILER_NVHPC_C  1
0307   #endif
0308   #define PLATFORM_COMPILER_VERSION \
0309           PLATFORM_COMPILER_VERSION_INT(__NVCOMPILER_MAJOR__,__NVCOMPILER_MINOR__,__NVCOMPILER_PATCHLEVEL__)
0310   #define PLATFORM_COMPILER_VERSION_STR \
0311       PLATFORM_STRINGIFY(__NVCOMPILER_MAJOR__) "." PLATFORM_STRINGIFY(__NVCOMPILER_MINOR__) "-" PLATFORM_STRINGIFY(__NVCOMPILER_PATCHLEVEL__)
0312 
0313 #elif defined(__PGI)
0314   #define PLATFORM_COMPILER_PGI  1
0315   #define PLATFORM_COMPILER_FAMILYNAME PGI
0316   #define PLATFORM_COMPILER_FAMILYID 4
0317   #ifdef __cplusplus
0318     #define PLATFORM_COMPILER_PGI_CXX  1
0319   #else
0320     #define PLATFORM_COMPILER_PGI_C  1
0321   #endif
0322   #if __PGIC__ == 99 
0323     /* bug 2230: PGI versioning was broken for some platforms in 7.0
0324                  no way to know exact version, but provide something slightly more accurate */
0325     #define PLATFORM_COMPILER_VERSION 0x070000
0326     #define PLATFORM_COMPILER_VERSION_STR "7.?-?"
0327   #elif defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__)
0328     #define PLATFORM_COMPILER_VERSION \
0329             PLATFORM_COMPILER_VERSION_INT(__PGIC__,__PGIC_MINOR__,__PGIC_PATCHLEVEL__)
0330     #define PLATFORM_COMPILER_VERSION_STR \
0331             PLATFORM_STRINGIFY(__PGIC__) "." PLATFORM_STRINGIFY(__PGIC_MINOR__) "-" PLATFORM_STRINGIFY(__PGIC_PATCHLEVEL__)
0332   #else
0333     /* PGI before 6.1-4 lacks any version ID preprocessor macros - so use this filthy hack */
0334     #ifdef PLATFORM_PGI_IS_ANCIENT
0335       /* Include below might fail for ancient versions lacking this header, but testing shows it
0336          works back to at least 5.1-3 (Nov 2003), and based on docs probably back to 3.2 (Sep 2000) */
0337         #define PLATFORM_COMPILER_VERSION 0       
0338     #elif defined(__x86_64__) /* bug 1753 - 64-bit omp.h upgrade happenned in <6.0-8,6.1-1] */
0339       #include "omp.h"
0340       #if defined(_PGOMP_H)
0341         /* 6.1.1 or newer */
0342         #define PLATFORM_COMPILER_VERSION 0x060101
0343         #define PLATFORM_COMPILER_VERSION_STR ">=6.1-1"
0344       #else
0345         /* 6.0.8 or older */
0346         #define PLATFORM_COMPILER_VERSION 0
0347         #define PLATFORM_COMPILER_VERSION_STR "<=6.0-8"
0348       #endif
0349     #else /* 32-bit omp.h upgrade happenned in <5.2-4,6.0-8] */
0350       #include "omp.h"
0351       #if defined(_PGOMP_H)
0352         /* 6.0-8 or newer */
0353         #define PLATFORM_COMPILER_VERSION 0x060008
0354         #define PLATFORM_COMPILER_VERSION_STR ">=6.0-8"
0355       #else
0356         /* 5.2-4 or older */
0357         #define PLATFORM_COMPILER_VERSION 0
0358         #define PLATFORM_COMPILER_VERSION_STR "<=5.2-4"
0359       #endif
0360     #endif
0361   #endif
0362 
0363 #elif defined(__xlC__) || defined(__ibmxl__)
0364   #define PLATFORM_COMPILER_XLC  1
0365   #define PLATFORM_COMPILER_FAMILYNAME XLC
0366   #define PLATFORM_COMPILER_FAMILYID 5
0367   #ifdef __cplusplus
0368     #define PLATFORM_COMPILER_XLC_CXX  1
0369   #else
0370     #define PLATFORM_COMPILER_XLC_C  1
0371   #endif
0372   #ifdef __ibmxl_version__
0373     #define PLATFORM_COMPILER_VERSION \
0374       (__ibmxl_version__ << 24 | __ibmxl_release__ << 16 | \
0375        __ibmxl_modification__ << 8 | __ibmxl_ptf_fix_level__)
0376     #define PLATFORM_COMPILER_VERSION_STR \
0377       PLATFORM_STRINGIFY(__ibmxl_version__) "." PLATFORM_STRINGIFY(__ibmxl_release__) "." PLATFORM_STRINGIFY(__ibmxl_modification__) "." PLATFORM_STRINGIFY(__ibmxl_ptf_fix_level__)
0378   #else
0379     #ifdef __xlC_ver__
0380       #define PLATFORM_COMPILER_VERSION (__xlC__ << 16 | __xlC_ver__)
0381     #else
0382       #define PLATFORM_COMPILER_VERSION (__xlC__ << 16)
0383     #endif
0384     #ifdef __xlc__
0385       #define PLATFORM_COMPILER_VERSION_STR __xlc__
0386     #else
0387       #define PLATFORM_COMPILER_VERSION_STR PLATFORM_STRINGIFY(__xlC__)
0388     #endif
0389   #endif
0390   #define PLATFORM_COMPILER_VERSION_INT(maj,min,pat) \
0391         ( ((maj) << 24) | ((min) << 16) | ((pat) << 8) )
0392 
0393 #elif defined(__DECC) || defined(__DECCXX)
0394   #define PLATFORM_COMPILER_COMPAQ  1
0395   #define PLATFORM_COMPILER_FAMILYNAME COMPAQ
0396   #define PLATFORM_COMPILER_FAMILYID 6
0397   #ifdef __cplusplus
0398     #define PLATFORM_COMPILER_COMPAQ_CXX  1
0399   #else
0400     #define PLATFORM_COMPILER_COMPAQ_C  1
0401   #endif
0402   #if defined(__DECC_VER)
0403     #define PLATFORM_COMPILER_VERSION __DECC_VER
0404   #elif defined(__DECCXX_VER)
0405     #define PLATFORM_COMPILER_VERSION __DECCXX_VER
0406   #endif
0407 
0408   #define PLATFORM_COMPILER_VERSION_INT(maj,min,pat) \
0409         ( ((maj) * 10000000) + ((min) * 100000) + (90000) + (pat) )
0410   /* 90000 = official ver, 80000 = customer special ver, 60000 = field test ver */
0411 
0412 #elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
0413   #define PLATFORM_COMPILER_SUN  1
0414   #define PLATFORM_COMPILER_FAMILYNAME SUN
0415   #define PLATFORM_COMPILER_FAMILYID 7
0416   #ifdef __cplusplus
0417     #define PLATFORM_COMPILER_SUN_CXX  1
0418   #else
0419     #define PLATFORM_COMPILER_SUN_C  1
0420   #endif
0421   #if defined(__SUNPRO_C) && __SUNPRO_C > 0
0422     #define PLATFORM_COMPILER_VERSION __SUNPRO_C
0423   #elif defined(__SUNPRO_CC) && __SUNPRO_CC > 0
0424     #define PLATFORM_COMPILER_VERSION __SUNPRO_CC
0425   #endif
0426   /* Sun version numbers look like hex but are actually a sloppy concatenation of decimal version numbers
0427    * leading to weird discontinuities in the version space, luckily it remains monotonic (so far)
0428    */
0429   #define PLATFORM_COMPILER_VERSION_INT(maj,min,pat) ( \
0430         (min) < 10 ?                                   \
0431         ( ((maj) << 8) | ((min) << 4) | (pat) ) :      \
0432         ( ((maj) << 12) | (((min)/10) << 8) | (((min)%10) << 4) | (pat) )  )
0433 
0434 #elif defined(__HP_cc) || defined(__HP_aCC)
0435   #define PLATFORM_COMPILER_HP  1
0436   #define PLATFORM_COMPILER_FAMILYNAME HP
0437   #define PLATFORM_COMPILER_FAMILYID 8
0438   #ifdef __cplusplus
0439     #define PLATFORM_COMPILER_HP_CXX  1
0440   #else
0441     #define PLATFORM_COMPILER_HP_C  1
0442   #endif
0443   #if defined(__HP_cc) && __HP_cc > 0
0444     #define PLATFORM_COMPILER_VERSION __HP_cc
0445   #elif defined(__HP_aCC) && __HP_aCC > 0
0446     #define PLATFORM_COMPILER_VERSION __HP_aCC
0447   #endif
0448   #define PLATFORM_COMPILER_VERSION_INT(maj,min,pat) \
0449         ( ((maj) << 16) | ((min) << 8) | (pat) )
0450 
0451 #elif defined(_SGI_COMPILER_VERSION) || \
0452    (defined(_COMPILER_VERSION) && defined(__sgi) && !defined(__GNUC__)) /* 7.3.0 and earlier lack _SGI_COMPILER_VERSION */
0453   #define PLATFORM_COMPILER_SGI  1
0454   #define PLATFORM_COMPILER_FAMILYNAME SGI
0455   #define PLATFORM_COMPILER_FAMILYID 9
0456   #ifdef __cplusplus
0457     #define PLATFORM_COMPILER_SGI_CXX  1
0458   #else
0459     #define PLATFORM_COMPILER_SGI_C  1
0460   #endif
0461   #if defined(_SGI_COMPILER_VERSION) && _SGI_COMPILER_VERSION > 0
0462     #define PLATFORM_COMPILER_VERSION _SGI_COMPILER_VERSION
0463   #elif defined(_COMPILER_VERSION) && _COMPILER_VERSION > 0
0464     #define PLATFORM_COMPILER_VERSION _COMPILER_VERSION
0465   #endif
0466   #define PLATFORM_COMPILER_VERSION_INT(maj,min,pat) \
0467         ( ((maj) << 8) | ((min) << 4) | (pat) )
0468 
0469 #elif defined(_CRAYC) 
0470   #define PLATFORM_COMPILER_CRAY  1
0471   #define PLATFORM_COMPILER_FAMILYNAME CRAY
0472   #define PLATFORM_COMPILER_FAMILYID 10
0473   #ifdef __cplusplus
0474     #define PLATFORM_COMPILER_CRAY_CXX  1
0475   #else
0476     #define PLATFORM_COMPILER_CRAY_C  1
0477   #endif
0478   #if defined(_RELEASE_MAJOR) && defined(_RELEASE_MINOR) /* XE, XK, XC */
0479     #define PLATFORM_COMPILER_VERSION \
0480             PLATFORM_COMPILER_VERSION_INT(_RELEASE_MAJOR,_RELEASE_MINOR,0)
0481   #elif defined(_RELEASE) && defined(_RELEASE_MINOR) /* X1 and XT */
0482     #define PLATFORM_COMPILER_VERSION \
0483             PLATFORM_COMPILER_VERSION_INT(_RELEASE,_RELEASE_MINOR,0)
0484   #elif defined(_RELEASE) /* T3E */
0485     #define PLATFORM_COMPILER_VERSION \
0486             PLATFORM_COMPILER_VERSION_INT(_RELEASE,0,0)
0487   #endif
0488   #ifdef _RELEASE_STRING /* X1 and XT, XK, XC */
0489     #define PLATFORM_COMPILER_VERSION_STR _RELEASE_STRING
0490   #endif
0491 
0492 #elif defined(__KCC)
0493   #define PLATFORM_COMPILER_KAI  1
0494   #define PLATFORM_COMPILER_FAMILYNAME KAI
0495   #define PLATFORM_COMPILER_FAMILYID 11
0496   #ifdef __cplusplus
0497     #define PLATFORM_COMPILER_KAI_CXX  1
0498   #else
0499     #define PLATFORM_COMPILER_KAI_C  1
0500   #endif
0501 
0502 #elif defined(__MTA__)
0503   #define PLATFORM_COMPILER_MTA  1
0504   #define PLATFORM_COMPILER_FAMILYNAME MTA
0505   #define PLATFORM_COMPILER_FAMILYID 12
0506   #ifdef __cplusplus
0507     #define PLATFORM_COMPILER_MTA_CXX  1
0508   #else
0509     #define PLATFORM_COMPILER_MTA_C  1
0510   #endif
0511 
0512 #elif defined(_SX)
0513   #define PLATFORM_COMPILER_NECSX  1
0514   #define PLATFORM_COMPILER_FAMILYNAME NECSX
0515   #define PLATFORM_COMPILER_FAMILYID 13
0516   #ifdef __cplusplus
0517     #define PLATFORM_COMPILER_NECSX_CXX  1
0518   #else
0519     #define PLATFORM_COMPILER_NECSX_C  1
0520   #endif
0521 
0522 #elif defined(_MSC_VER)
0523   #define PLATFORM_COMPILER_MICROSOFT  1
0524   #define PLATFORM_COMPILER_FAMILYNAME MICROSOFT
0525   #define PLATFORM_COMPILER_FAMILYID 14
0526   #ifdef __cplusplus
0527     #define PLATFORM_COMPILER_MICROSOFT_CXX  1
0528   #else
0529     #define PLATFORM_COMPILER_MICROSOFT_C  1
0530   #endif
0531   #define PLATFORM_COMPILER_VERSION _MSC_VER
0532 
0533 #elif defined(__TINYC__)
0534   #define PLATFORM_COMPILER_TINY  1
0535   #define PLATFORM_COMPILER_FAMILYNAME TINY
0536   #define PLATFORM_COMPILER_FAMILYID 15
0537   #ifdef __cplusplus
0538     #define PLATFORM_COMPILER_TINY_CXX  1
0539   #else
0540     #define PLATFORM_COMPILER_TINY_C  1
0541   #endif
0542 
0543 #elif defined(__LCC__)
0544   #define PLATFORM_COMPILER_LCC 1
0545   #define PLATFORM_COMPILER_FAMILYNAME LCC
0546   #define PLATFORM_COMPILER_FAMILYID 16
0547   #ifdef __cplusplus
0548     #define PLATFORM_COMPILER_LCC_CXX  1
0549   #else
0550     #define PLATFORM_COMPILER_LCC_C  1
0551   #endif
0552 
0553 #elif defined(__OPENCC__)
0554   #define PLATFORM_COMPILER_OPEN64  1
0555   #define PLATFORM_COMPILER_FAMILYNAME OPEN64
0556   #define PLATFORM_COMPILER_FAMILYID 17
0557   #ifdef __cplusplus
0558     #define PLATFORM_COMPILER_OPEN64_CXX  1
0559   #else
0560     #define PLATFORM_COMPILER_OPEN64_C  1
0561   #endif
0562   /* Note: can't use __OPENCC_PATCHLEVEL__ because it is sometimes non-integer (eg 3.2).
0563      Adding a cast would not result in a preprocessor constant expression. */
0564   #define PLATFORM_COMPILER_VERSION \
0565           PLATFORM_COMPILER_VERSION_INT(__OPENCC__,__OPENCC_MINOR__,0)
0566   #define PLATFORM_COMPILER_VERSION_STR __OPEN64__
0567 
0568 #elif defined(__PCC__)
0569   #define PLATFORM_COMPILER_PCC  1
0570   #define PLATFORM_COMPILER_FAMILYNAME PCC
0571   #define PLATFORM_COMPILER_FAMILYID 18
0572   #ifdef __cplusplus
0573     #define PLATFORM_COMPILER_PCC_CXX  1
0574   #else
0575     #define PLATFORM_COMPILER_PCC_C  1
0576   #endif
0577   #define PLATFORM_COMPILER_VERSION \
0578           PLATFORM_COMPILER_VERSION_INT(__PCC__,__PCC_MINOR__,__PCC_MINORMINOR__)
0579   #define PLATFORM_COMPILER_VERSION_STR \
0580       PLATFORM_STRINGIFY(__PCC__) "." PLATFORM_STRINGIFY(__PCC_MINOR__) "." PLATFORM_STRINGIFY(__PCC_MINORMINOR__)
0581 
0582 #elif defined(__clang__)
0583   #define PLATFORM_COMPILER_CLANG  1
0584   #define PLATFORM_COMPILER_FAMILYNAME CLANG
0585   #define PLATFORM_COMPILER_FAMILYID 19
0586   #ifdef __cplusplus
0587     #define PLATFORM_COMPILER_CLANG_CXX  1
0588   #else
0589     #define PLATFORM_COMPILER_CLANG_C  1
0590   #endif
0591   #ifdef __clang_version__
0592     /* clang 2.7 (gcc 4.2.1 compliant) and earlier lacked specific version identification */
0593     #define PLATFORM_COMPILER_VERSION \
0594             PLATFORM_COMPILER_VERSION_INT(__clang_major__,__clang_minor__,__clang_patchlevel__)
0595     #define PLATFORM_COMPILER_VERSION_STR __clang_version__
0596   #endif
0597 
0598 /* NOTE: PLATFORM_COMPILER_FAMILYID "20" is allocted to NVHPC, appearing earlier */
0599 
0600 #else /* unknown compiler */
0601   #define PLATFORM_COMPILER_UNKNOWN  1
0602 #endif
0603 
0604 /* this stanza comes last, because many vendor compilers lie and claim 
0605    to be GNU C for compatibility reasons and/or because they share a frontend */ 
0606 #undef _PLATFORM_COMPILER_GNU_VERSION_STR
0607 #undef __PLATFORM_COMPILER_GNU_VERSION_STR
0608 #if defined(__GNUC__)
0609   #undef PLATFORM_COMPILER_UNKNOWN
0610   #ifndef PLATFORM_COMPILER_FAMILYID
0611     #define PLATFORM_COMPILER_GNU  1
0612     #define PLATFORM_COMPILER_FAMILYNAME GNU
0613     #define PLATFORM_COMPILER_FAMILYID 1
0614     #ifdef __cplusplus
0615       #define PLATFORM_COMPILER_GNU_CXX  1
0616     #else
0617       #define PLATFORM_COMPILER_GNU_C  1
0618     #endif
0619    #if defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
0620     #define PLATFORM_COMPILER_VERSION \
0621             PLATFORM_COMPILER_VERSION_INT(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__)
0622    #elif defined(__GNUC_MINOR__) /* older versions of egcs lack __GNUC_PATCHLEVEL__ */
0623     #define PLATFORM_COMPILER_VERSION \
0624             PLATFORM_COMPILER_VERSION_INT(__GNUC__,__GNUC_MINOR__,0)
0625    #else
0626     #define PLATFORM_COMPILER_VERSION \
0627             PLATFORM_COMPILER_VERSION_INT(__GNUC__,0,0)
0628    #endif
0629     #define PLATFORM_COMPILER_VERSION_STR __PLATFORM_COMPILER_GNU_VERSION_STR
0630   #else
0631     #define _PLATFORM_COMPILER_GNU_VERSION_STR __PLATFORM_COMPILER_GNU_VERSION_STR
0632   #endif
0633   /* gather any advertised GNU version number info, even for non-gcc compilers */
0634   #if defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
0635     #define __PLATFORM_COMPILER_GNU_VERSION_STR \
0636       PLATFORM_STRINGIFY(__GNUC__) "." PLATFORM_STRINGIFY(__GNUC_MINOR__) "." PLATFORM_STRINGIFY(__GNUC_PATCHLEVEL__)
0637   #elif defined(__GNUC_MINOR__)
0638     #define __PLATFORM_COMPILER_GNU_VERSION_STR \
0639       PLATFORM_STRINGIFY(__GNUC__) "." PLATFORM_STRINGIFY(__GNUC_MINOR__) ".?"
0640   #else
0641     #define __PLATFORM_COMPILER_GNU_VERSION_STR \
0642       PLATFORM_STRINGIFY(__GNUC__) ".?.?"
0643   #endif
0644 #elif defined(PLATFORM_COMPILER_UNKNOWN) /* unknown compiler */
0645   #define PLATFORM_COMPILER_FAMILYNAME UNKNOWN
0646   #define PLATFORM_COMPILER_FAMILYID 0 
0647 #endif
0648 
0649 /* defaulting */
0650 
0651 #ifndef PLATFORM_COMPILER_VERSION
0652 #define PLATFORM_COMPILER_VERSION 0 /* don't know */
0653 #endif
0654 
0655 #ifndef PLATFORM_COMPILER_VERSION_STR
0656 #define PLATFORM_COMPILER_VERSION_STR PLATFORM_STRINGIFY(PLATFORM_COMPILER_VERSION)
0657 #endif
0658 
0659 #ifndef PLATFORM_COMPILER_VERSION_INT
0660 #define PLATFORM_COMPILER_VERSION_INT(maj,min,pat) \
0661         (((maj) << 16) | ((min) << 8) | (pat))
0662 #endif
0663 
0664 /* version check macros */
0665 
0666 #define PLATFORM_COMPILER_VERSION_GT(maj,min,pat) \
0667         PLATFORM_COMPILER_VERSION >  PLATFORM_COMPILER_VERSION_INT(maj,min,pat)
0668 #define PLATFORM_COMPILER_VERSION_GE(maj,min,pat) \
0669         PLATFORM_COMPILER_VERSION >= PLATFORM_COMPILER_VERSION_INT(maj,min,pat)
0670 #define PLATFORM_COMPILER_VERSION_EQ(maj,min,pat) \
0671         PLATFORM_COMPILER_VERSION == PLATFORM_COMPILER_VERSION_INT(maj,min,pat)
0672 #define PLATFORM_COMPILER_VERSION_LE(maj,min,pat) \
0673         PLATFORM_COMPILER_VERSION <= PLATFORM_COMPILER_VERSION_INT(maj,min,pat)
0674 #define PLATFORM_COMPILER_VERSION_LT(maj,min,pat) \
0675         PLATFORM_COMPILER_VERSION <  PLATFORM_COMPILER_VERSION_INT(maj,min,pat)
0676 
0677 /* misc feature detection */
0678 
0679 #ifdef __cplusplus
0680   #define PLATFORM_COMPILER_ID (10000+PLATFORM_COMPILER_FAMILYID)
0681 #else
0682   #define PLATFORM_COMPILER_ID PLATFORM_COMPILER_FAMILYID
0683 #endif
0684 
0685 /* default language spec conformance detection */
0686 #if !defined(PLATFORM_COMPILER_C_LANGLVL) && !defined(PLATFORM_COMPILER_CXX_LANGLVL)
0687   #if defined(__cplusplus) && (__cplusplus > 0)  /* C++98 or newer */
0688     #define PLATFORM_COMPILER_CXX_LANGLVL  __cplusplus
0689   #elif defined(__STDC_VERSION__) && (__STDC_VERSION__ > 0)  /* C95 or newer */
0690     #define PLATFORM_COMPILER_C_LANGLVL  __STDC_VERSION__
0691   #elif defined(__STDC__) && !defined(__cplusplus) && !defined(__STDC_VERSION__) /* C89/C90 */
0692     #define PLATFORM_COMPILER_C_LANGLVL  199000L
0693   #else 
0694     /* unknown - leave both undef */
0695   #endif
0696 #endif
0697 
0698 #undef _PLATFORM_COMPILER_STD_STDC
0699 #ifdef __STDC__
0700   #define _PLATFORM_COMPILER_STD_STDC "__STDC__"
0701 #else
0702   #define _PLATFORM_COMPILER_STD_STDC "-"
0703 #endif
0704 #undef _PLATFORM_COMPILER_STD_STDC_VERSION
0705 #ifdef __STDC_VERSION__
0706   #define _PLATFORM_COMPILER_STD_STDC_VERSION ",__STDC_VERSION__=" PLATFORM_STRINGIFY(__STDC_VERSION__)
0707 #else
0708   #define _PLATFORM_COMPILER_STD_STDC_VERSION
0709 #endif
0710 #undef _PLATFORM_COMPILER_STD_STDC_EXT
0711 #ifdef __STDC_EXT__
0712   #define _PLATFORM_COMPILER_STD_STDC_EXT ",__STDC_EXT__=" PLATFORM_STRINGIFY(__STDC_EXT__)
0713 #else
0714   #define _PLATFORM_COMPILER_STD_STDC_EXT 
0715 #endif
0716 #undef _PLATFORM_COMPILER_STD_CPLUSPLUS
0717 #ifdef __cplusplus
0718   #define _PLATFORM_COMPILER_STD_CPLUSPLUS ",__cplusplus=" PLATFORM_STRINGIFY(__cplusplus)
0719 #else
0720   #define _PLATFORM_COMPILER_STD_CPLUSPLUS 
0721 #endif
0722 
0723 #undef _PLATFORM_COMPILER_MISC_VERSION_STR
0724 #ifndef _PLATFORM_COMPILER_MISC_VERSION_STR
0725   #ifdef __VERSION__
0726     #define _PLATFORM_COMPILER_MISC_VERSION_STR "|misc:" __VERSION__
0727   #else
0728     #define _PLATFORM_COMPILER_MISC_VERSION_STR
0729   #endif
0730 #endif
0731 #undef _PLATFORM_COMPILER_GNU_VERSION_STR_HELP
0732 #ifdef _PLATFORM_COMPILER_GNU_VERSION_STR
0733     #define _PLATFORM_COMPILER_GNU_VERSION_STR_HELP "|GNU:" _PLATFORM_COMPILER_GNU_VERSION_STR
0734 #else
0735     #define _PLATFORM_COMPILER_GNU_VERSION_STR_HELP
0736 #endif
0737 
0738 #define PLATFORM_COMPILER_IDSTR                                      \
0739         "|COMPILER_FAMILY:"                                          \
0740           PLATFORM_STRINGIFY(PLATFORM_COMPILER_FAMILYNAME)           \
0741         "|COMPILER_VERSION:" PLATFORM_COMPILER_VERSION_STR           \
0742         "|COMPILER_FAMILYID:"                                        \
0743           PLATFORM_STRINGIFY(PLATFORM_COMPILER_FAMILYID)             \
0744          _PLATFORM_COMPILER_GNU_VERSION_STR_HELP                     \
0745         "|STD:" _PLATFORM_COMPILER_STD_STDC                          \
0746                 _PLATFORM_COMPILER_STD_STDC_VERSION                  \
0747                 _PLATFORM_COMPILER_STD_STDC_EXT                      \
0748                 _PLATFORM_COMPILER_STD_CPLUSPLUS                     \
0749          _PLATFORM_COMPILER_MISC_VERSION_STR                         \
0750         "|"
0751 
0752 /* ------------------------------------------------------------------------------------ */
0753 /* OS detection */
0754 /* 
0755    PLATFORM_OS_<family>:
0756      defined to a positive value if OS belongs to a given family, undef otherwise
0757    PLATFORM_OS_FAMILYNAME:
0758      unquoted token which provides the OS family name
0759 
0760    Some systems also define a subfamily:
0761     PLATFORM_OS_SUBFAMILY_<subfamily>: positive value or undef
0762     PLATFORM_OS_SUBFAMILYNAME: unquoted token for subfamily name or undef
0763 */
0764 
0765 #if defined(__LIBCATAMOUNT__) || defined(__QK_USER__)
0766   #define PLATFORM_OS_CATAMOUNT 1
0767   #define PLATFORM_OS_FAMILYNAME CATAMOUNT
0768 
0769 #elif defined(GASNETI_ARCH_BGP) || defined(__bgp__)
0770   #define PLATFORM_OS_BGP 1
0771   #define PLATFORM_OS_FAMILYNAME BGP
0772 
0773 #elif defined(GASNETI_ARCH_BGQ) || defined(__bgq__)
0774   #define PLATFORM_OS_BGQ 1
0775   #define PLATFORM_OS_FAMILYNAME BGQ
0776 
0777 #elif defined(__K42)
0778   #define PLATFORM_OS_K42 1
0779   #define PLATFORM_OS_FAMILYNAME K42
0780 
0781 #elif defined(__uClinux__)
0782   #define PLATFORM_OS_UCLINUX 1
0783   #define PLATFORM_OS_FAMILYNAME UCLINUX
0784 
0785 #elif defined(__linux) || defined(__linux__) || defined(__gnu_linux__)
0786   #define PLATFORM_OS_LINUX 1
0787   #define PLATFORM_OS_FAMILYNAME LINUX
0788   #if defined(GASNETI_ARCH_WSL)
0789     #define PLATFORM_OS_SUBFAMILY_WSL 1
0790     #define PLATFORM_OS_SUBFAMILYNAME WSL
0791   #elif defined(__CRAYXT_COMPUTE_LINUX_TARGET)
0792     /* NOTE: As of 2022-07 this is ONLY defined for the Cray cc/CC wrappers, and not the raw PrgEnv compilers */
0793     #define PLATFORM_OS_SUBFAMILY_CNL 1
0794     #define PLATFORM_OS_SUBFAMILYNAME CNL
0795   #endif
0796 
0797 #elif defined(__blrts) || defined(__blrts__) || defined(__gnu_blrts__)
0798   #define PLATFORM_OS_BLRTS 1
0799   #define PLATFORM_OS_FAMILYNAME BLRTS
0800 
0801 #elif defined(__CYGWIN__)
0802   #define PLATFORM_OS_CYGWIN 1
0803   #define PLATFORM_OS_FAMILYNAME CYGWIN
0804 
0805 #elif defined(_WIN32)
0806   #define PLATFORM_OS_MSWINDOWS 1
0807   #define PLATFORM_OS_FAMILYNAME MSWINDOWS
0808 
0809 #elif defined(_AIX)
0810   #define PLATFORM_OS_AIX 1
0811   #define PLATFORM_OS_FAMILYNAME AIX
0812 
0813 #elif defined(__osf__) || defined(__digital__)
0814   #define PLATFORM_OS_TRU64 1
0815   #define PLATFORM_OS_FAMILYNAME TRU64
0816 
0817 #elif defined(__FreeBSD) || defined(__FreeBSD__)
0818   #define PLATFORM_OS_FREEBSD 1
0819   #define PLATFORM_OS_FAMILYNAME FREEBSD
0820 
0821 #elif defined(__NetBSD) || defined(__NetBSD__)
0822   #define PLATFORM_OS_NETBSD 1
0823   #define PLATFORM_OS_FAMILYNAME NETBSD
0824 
0825 #elif defined(__OpenBSD__)
0826   #define PLATFORM_OS_OPENBSD 1
0827   #define PLATFORM_OS_FAMILYNAME OPENBSD
0828 
0829 #elif defined(__sun) || defined(__sun__)
0830   #define PLATFORM_OS_SOLARIS 1
0831   #define PLATFORM_OS_FAMILYNAME SOLARIS
0832 
0833 #elif (defined(__APPLE__) && defined(__MACH__)) || \
0834       defined(__osx86__) /* PGI on OSX */
0835   #define PLATFORM_OS_DARWIN 1
0836   #define PLATFORM_OS_FAMILYNAME DARWIN
0837 
0838 #elif defined(__sgi) || defined(__sgi__)
0839   #define PLATFORM_OS_IRIX 1
0840   #define PLATFORM_OS_FAMILYNAME IRIX
0841 
0842 #elif defined(__hpux) || defined(__hpux__)
0843   #define PLATFORM_OS_HPUX 1
0844   #define PLATFORM_OS_FAMILYNAME HPUX
0845 
0846 #elif defined(_CRAY) || defined(_UNICOSMP)
0847   #define PLATFORM_OS_UNICOS 1
0848   #define PLATFORM_OS_FAMILYNAME UNICOS
0849 
0850 #elif defined(__MTA__)
0851   #define PLATFORM_OS_MTA 1
0852   #define PLATFORM_OS_FAMILYNAME MTA
0853 
0854 #elif defined(_SX)
0855   #define PLATFORM_OS_SUPERUX 1
0856   #define PLATFORM_OS_FAMILYNAME SUPERUX
0857 
0858 #else
0859   #define PLATFORM_OS_UNKNOWN 1
0860   #define PLATFORM_OS_FAMILYNAME UNKNOWN
0861 #endif
0862 
0863 /* ------------------------------------------------------------------------------------ */
0864 /* Architecture detection */
0865 /* 
0866    PLATFORM_ARCH_<family>:
0867      defined to positive value if CPU belongs to a given family, undef otherwise
0868    PLATFORM_ARCH_FAMILYNAME:
0869      unquoted token which provides the CPU family name
0870 
0871    PLATFORM_ARCH_32              - 32-bit pointers
0872    PLATFORM_ARCH_64              - 64-bit pointers
0873    PLATFORM_ARCH_BIG_ENDIAN      - big-endian word order
0874    PLATFORM_ARCH_LITTLE_ENDIAN   - little-endian word order
0875      defined to positive value if CPU is known to have the indicated property, undef otherwise
0876  */
0877 
0878 #if defined(__ppc64) || defined(__ppc64__) || \
0879     defined(__PPC64) || defined(__PPC64__) || \
0880     defined(__powerpc64) || defined(__powerpc64__) 
0881   #define PLATFORM_ARCH_POWERPC 1
0882   #define PLATFORM_ARCH_FAMILYNAME POWERPC
0883   #define _PLATFORM_ARCH_64 1
0884   #define _PLATFORM_ARCH_BIG_ENDIAN 1
0885 
0886 #elif defined(_POWER) || \
0887       defined(__PPC)  || defined(__PPC__) || \
0888       defined(__powerpc) || defined(__powerpc__) || \
0889       defined(__ppc) || defined(__ppc__) || \
0890       defined(__POWERPC__)
0891   #define PLATFORM_ARCH_POWERPC 1
0892   #define PLATFORM_ARCH_FAMILYNAME POWERPC
0893   #define _PLATFORM_ARCH_32 1
0894   #define _PLATFORM_ARCH_BIG_ENDIAN 1
0895 
0896 #elif defined(_ARCH_PPC) || defined(_ARCH_PPC64)
0897   #define PLATFORM_ARCH_POWERPC 1
0898   #define PLATFORM_ARCH_FAMILYNAME POWERPC
0899   #define _PLATFORM_ARCH_BIG_ENDIAN 1
0900 
0901 #elif defined(__KNC__) || defined(__MIC__)
0902   #define PLATFORM_ARCH_MIC 1
0903   #define PLATFORM_ARCH_FAMILYNAME MIC
0904   #define _PLATFORM_ARCH_64 1
0905   #define _PLATFORM_ARCH_LITTLE_ENDIAN 1
0906 
0907 #elif defined(__x86_64) || defined(__x86_64__) || \
0908     defined(__athlon) || defined(__athlon__) || \
0909     defined(__amd64)  || defined(__amd64__)
0910   #define PLATFORM_ARCH_X86_64 1
0911   #define PLATFORM_ARCH_FAMILYNAME X86_64
0912   #define _PLATFORM_ARCH_64 1
0913   #define _PLATFORM_ARCH_LITTLE_ENDIAN 1
0914 
0915 #elif defined(__ia64__) || defined(__ia64)
0916   #define PLATFORM_ARCH_IA64 1
0917   #define PLATFORM_ARCH_FAMILYNAME IA64
0918   #define _PLATFORM_ARCH_64 1
0919   #if defined(PLATFORM_OS_LINUX) || defined(PLATFORM_OS_FREEBSD)
0920     #define _PLATFORM_ARCH_LITTLE_ENDIAN 1
0921   #elif defined(PLATFORM_OS_HPUX)
0922     #define _PLATFORM_ARCH_BIG_ENDIAN 1
0923   #else
0924     /* Unknown.  Hope one of the other mechanisms can sort it out. */
0925   #endif
0926 
0927 #elif defined(__i386__) || defined(__i386) || \
0928       defined(__i486__) || defined(__i486) || \
0929       defined(__i586__) || defined(__i586) || \
0930       defined(__i686__) || defined(__i686) || \
0931       defined(__pentiumpro) || defined(__pentiumpro__) || \
0932       defined(_M_IX86)
0933   #define PLATFORM_ARCH_X86 1
0934   #define PLATFORM_ARCH_FAMILYNAME X86
0935   #define _PLATFORM_ARCH_32 1
0936   #define _PLATFORM_ARCH_LITTLE_ENDIAN 1
0937 
0938 #elif defined(__alpha) || defined(__alpha__)
0939   #define PLATFORM_ARCH_ALPHA 1
0940   #define PLATFORM_ARCH_FAMILYNAME ALPHA
0941   #define _PLATFORM_ARCH_64 1
0942   #define _PLATFORM_ARCH_LITTLE_ENDIAN 1
0943 
0944 #elif defined(_mips) || defined(__mips) || defined(__mips__) || \
0945     defined(__host_mips) || defined(__host_mips__) || \
0946     defined(_MIPS_ARCH) || defined(__R4000)
0947   #define PLATFORM_ARCH_MIPS 1
0948   #define PLATFORM_ARCH_FAMILYNAME MIPS
0949   #ifdef _MIPSEL /* MIPS cores support both little and big endian modes */
0950     /* SiCortex */
0951     #define _PLATFORM_ARCH_LITTLE_ENDIAN 1
0952   #else
0953     /* IRIX */
0954     #define _PLATFORM_ARCH_BIG_ENDIAN 1
0955   #endif
0956   #ifdef _MIPS_SZPTR
0957     #if _MIPS_SZPTR == 32
0958       #define _PLATFORM_ARCH_32 1
0959     #elif _MIPS_SZPTR == 64
0960       #define _PLATFORM_ARCH_64 1
0961     #endif
0962   #endif
0963 
0964 #elif defined(__sparc) || defined(__sparc__) || \
0965     defined(__sparclet__) || defined(__sparclite__) || \
0966     defined(__sparcv8) || defined(__sparcv9)
0967   #define PLATFORM_ARCH_SPARC 1
0968   #define PLATFORM_ARCH_FAMILYNAME SPARC
0969   #define _PLATFORM_ARCH_BIG_ENDIAN 1
0970 
0971 #elif defined(__hppa) || defined(__hppa__) || \
0972     defined(__parisc) || defined(__parisc__) || \
0973     defined(_PA_RISC1_1) || defined(_PA_RISC2_0)
0974   #define PLATFORM_ARCH_PARISC 1
0975   #define PLATFORM_ARCH_FAMILYNAME PARISC
0976   #define _PLATFORM_ARCH_BIG_ENDIAN 1
0977 
0978 #elif defined(__crayx1)
0979   #define PLATFORM_ARCH_CRAYX1 1
0980   #define PLATFORM_ARCH_FAMILYNAME CRAYX1
0981   #define _PLATFORM_ARCH_BIG_ENDIAN 1
0982   #define _PLATFORM_ARCH_64 1
0983 
0984 #elif defined(_CRAYT3E)
0985   #define PLATFORM_ARCH_CRAYT3E 1
0986   #define PLATFORM_ARCH_FAMILYNAME CRAYT3E
0987   #define _PLATFORM_ARCH_BIG_ENDIAN 1
0988   #define _PLATFORM_ARCH_64 1
0989 
0990 #elif defined(__MTA__)
0991   #define PLATFORM_ARCH_MTA 1
0992   #define PLATFORM_ARCH_FAMILYNAME MTA
0993 
0994 #elif defined(_SX)
0995   #define PLATFORM_ARCH_NECSX 1
0996   #define PLATFORM_ARCH_FAMILYNAME NECSX
0997 
0998 #elif defined(__MICROBLAZE__)
0999   #define PLATFORM_ARCH_MICROBLAZE 1
1000   #define PLATFORM_ARCH_FAMILYNAME MICROBLAZE
1001   #define _PLATFORM_ARCH_BIG_ENDIAN 1
1002   #define _PLATFORM_ARCH_32 1
1003 
1004 #elif defined(__arm__)
1005   #define PLATFORM_ARCH_ARM 1
1006   #define PLATFORM_ARCH_FAMILYNAME ARM
1007   #define _PLATFORM_ARCH_32 1
1008   #if defined(__ARMEB__)
1009     #define _PLATFORM_ARCH_BIG_ENDIAN 1
1010   #elif defined(__ARMEL__)
1011     #define _PLATFORM_ARCH_LITTLE_ENDIAN 1
1012   #endif
1013 
1014 #elif defined(__aarch64__)
1015   #define PLATFORM_ARCH_AARCH64 1
1016   #define PLATFORM_ARCH_FAMILYNAME AARCH64
1017   #if defined(__AARCH64EB__)
1018     #define _PLATFORM_ARCH_BIG_ENDIAN 1
1019   #elif defined(__AARCH64EL__)
1020     #define _PLATFORM_ARCH_LITTLE_ENDIAN 1
1021   #endif
1022 
1023 #elif defined(__tile__)
1024   #define PLATFORM_ARCH_TILE 1
1025   #define PLATFORM_ARCH_FAMILYNAME TILE
1026   #define _PLATFORM_ARCH_LITTLE_ENDIAN 1
1027   #if defined(__tilegx__)
1028     #define _PLATFORM_ARCH_64 1
1029   #else
1030     #define _PLATFORM_ARCH_32 1
1031   #endif
1032 
1033 #elif defined(__s390__)
1034   #define PLATFORM_ARCH_S390 1
1035   #define PLATFORM_ARCH_FAMILYNAME S390
1036   #define _PLATFORM_ARCH_BIG_ENDIAN 1
1037   #if defined(__s390x__)
1038     #define _PLATFORM_ARCH_64 1
1039   #else
1040     #define _PLATFORM_ARCH_32 1
1041   #endif
1042 
1043 #elif defined(__riscv)
1044   #define PLATFORM_ARCH_RISCV 1
1045   #define PLATFORM_ARCH_FAMILYNAME RISCV
1046   #define _PLATFORM_ARCH_LITTLE_ENDIAN 1
1047   #if __riscv_xlen == 32
1048     #define _PLATFORM_ARCH_32 1
1049   #else  /* (__riscv_xlen == 64) || (__riscv_xlen == 128) */
1050     #define _PLATFORM_ARCH_64 1
1051   #endif
1052 
1053 #else /* unknown CPU */
1054   #define PLATFORM_ARCH_UNKNOWN 1
1055   #define PLATFORM_ARCH_FAMILYNAME UNKNOWN
1056 #endif
1057 
1058 /* generic chip properties */
1059 
1060 #if defined(PLATFORM_ARCH_BIG_ENDIAN) || defined(PLATFORM_ARCH_LITTLE_ENDIAN)
1061   #error internal error in endianness configuration
1062 #endif
1063 
1064 /* PLATFORM_ARCH_{BIG,LITTLE}_ENDIAN:
1065     first detect common preprocessor defines
1066     then default to any arch-specific value provided
1067  */
1068 
1069 #if defined(__BIG_ENDIAN__) || defined(WORDS_BIGENDIAN) || \
1070     ( __BYTE_ORDER__ > 0 && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ )
1071   #define PLATFORM_ARCH_BIG_ENDIAN 1
1072 #elif defined(__LITTLE_ENDIAN__) || defined(WORDS_LITTLEENDIAN) || \
1073     ( __BYTE_ORDER__ > 0 && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ )
1074   #define PLATFORM_ARCH_LITTLE_ENDIAN 1
1075 #elif defined(_PLATFORM_ARCH_BIG_ENDIAN)
1076   #define PLATFORM_ARCH_BIG_ENDIAN 1
1077 #elif defined(_PLATFORM_ARCH_LITTLE_ENDIAN)
1078   #define PLATFORM_ARCH_LITTLE_ENDIAN 1
1079 #endif
1080 #undef _PLATFORM_ARCH_BIG_ENDIAN
1081 #undef _PLATFORM_ARCH_LITTLE_ENDIAN
1082 
1083 #if defined(PLATFORM_ARCH_BIG_ENDIAN) && defined(PLATFORM_ARCH_LITTLE_ENDIAN)
1084   #error conflicting endianness information
1085 #endif
1086 
1087 /* PLATFORM_ARCH_{32,64}: 
1088     first trust SIZEOF_VOID_P, which is most likely to be accurate
1089     next, detect common 32/64 preprocessor defines
1090     finally default to any arch-specific value provided
1091  */
1092 #if defined(PLATFORM_ARCH_64) || defined(PLATFORM_ARCH_32)
1093   #error internal error in bit width configuration
1094 #endif
1095 
1096 #if SIZEOF_VOID_P == 8
1097   #define PLATFORM_ARCH_64 1
1098 #elif SIZEOF_VOID_P == 4
1099   #define PLATFORM_ARCH_32 1
1100 #elif defined(_LP64) || defined(__LP64__) || \
1101       defined(__arch64__) || defined(__64BIT__) || \
1102       __INTPTR_MAX__ > 2147483647
1103   #define PLATFORM_ARCH_64 1
1104 #elif defined(_ILP32) || defined(__ILP32__) || \
1105       defined(__arch32__) || defined(__32BIT__) || \
1106       __INTPTR_MAX__ == 2147483647
1107   #define PLATFORM_ARCH_32 1
1108 #elif defined(_PLATFORM_ARCH_64)
1109   #define PLATFORM_ARCH_64 1
1110 #elif defined(_PLATFORM_ARCH_32)
1111   #define PLATFORM_ARCH_32 1
1112 #endif
1113 #undef _PLATFORM_ARCH_64
1114 #undef _PLATFORM_ARCH_32
1115 
1116 #if defined(PLATFORM_ARCH_64) && defined(PLATFORM_ARCH_32)
1117   #error conflicting bit width information
1118 #elif !defined(PLATFORM_ARCH_64) && !defined(PLATFORM_ARCH_32)
1119   #error missing bit width information
1120 #endif
1121 
1122 /* ------------------------------------------------------------------------------------ */
1123 /* handy test code that can be parsed after preprocess or executed to show platform results */
1124 #ifdef PLATFORM_SHOW
1125 #include <stdio.h>
1126 #include <assert.h>
1127 const char *
1128 COMPILER_FAMILYNAME = PLATFORM_STRINGIFY(PLATFORM_COMPILER_FAMILYNAME)
1129 , *
1130 COMPILER_FAMILYID = PLATFORM_STRINGIFY(PLATFORM_COMPILER_FAMILYID)
1131 , *
1132 COMPILER_VERSION_STR = PLATFORM_COMPILER_VERSION_STR
1133 , *
1134 COMPILER_IDSTR = PLATFORM_COMPILER_IDSTR
1135 , *
1136 OS_FAMILYNAME = PLATFORM_STRINGIFY(PLATFORM_OS_FAMILYNAME)
1137 , *
1138 ARCH_FAMILYNAME = PLATFORM_STRINGIFY(PLATFORM_ARCH_FAMILYNAME)
1139 ;
1140 int main(void) {
1141   #define PLATFORM_DISP(x) printf("PLATFORM_"#x"=%s\n",x)
1142   #define PLATFORM_DISPI(x) printf("PLATFORM_"#x"=%li\n",(long int)PLATFORM_##x)
1143   #define PLATFORM_DISPX(x) printf("PLATFORM_"#x"=0x%lx\n",(long int)PLATFORM_##x)
1144   PLATFORM_DISP(COMPILER_FAMILYNAME);
1145   PLATFORM_DISP(COMPILER_FAMILYID);
1146   PLATFORM_DISPI(COMPILER_ID);
1147   PLATFORM_DISPX(COMPILER_VERSION);
1148   PLATFORM_DISP(COMPILER_VERSION_STR);
1149   PLATFORM_DISP(COMPILER_IDSTR);
1150   #ifdef PLATFORM_COMPILER_C_LANGLVL
1151     PLATFORM_DISPI(COMPILER_C_LANGLVL);
1152   #elif defined(PLATFORM_COMPILER_CXX_LANGLVL)
1153     PLATFORM_DISPI(COMPILER_CXX_LANGLVL);
1154   #else
1155     printf("WARNING: Missing PLATFORM_COMPILER_C(XX)_LANGLVL!");
1156   #endif
1157   PLATFORM_DISP(OS_FAMILYNAME);
1158   #ifdef PLATFORM_OS_SUBFAMILYNAME
1159   { const char * OS_SUBFAMILYNAME = PLATFORM_STRINGIFY(PLATFORM_OS_SUBFAMILYNAME);
1160     PLATFORM_DISP(OS_SUBFAMILYNAME);
1161   }
1162   #endif
1163   PLATFORM_DISP(ARCH_FAMILYNAME);
1164   #ifdef PLATFORM_ARCH_32
1165     PLATFORM_DISPI(ARCH_32);
1166     assert(sizeof(void *) == 4);
1167   #else
1168     PLATFORM_DISPI(ARCH_64);
1169     assert(sizeof(void *) == 8);
1170   #endif
1171   { int x = 0x00FF;
1172     unsigned char *p = (unsigned char *)&x;
1173   #ifdef PLATFORM_ARCH_BIG_ENDIAN
1174     PLATFORM_DISPI(ARCH_BIG_ENDIAN);
1175     assert(*p == 0);
1176   #else
1177     PLATFORM_DISPI(ARCH_LITTLE_ENDIAN);
1178     assert(*p == 0xFF);
1179   #endif
1180   }
1181   return 0;
1182 }
1183 #endif
1184 /* ------------------------------------------------------------------------------------ */
1185 #endif