10b57cec5SDimitry Andric /*
20b57cec5SDimitry Andric  * kmp_version.cpp
30b57cec5SDimitry Andric  */
40b57cec5SDimitry Andric 
50b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
80b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
90b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #include "kmp.h"
140b57cec5SDimitry Andric #include "kmp_io.h"
150b57cec5SDimitry Andric #include "kmp_version.h"
160b57cec5SDimitry Andric 
170b57cec5SDimitry Andric // Replace with snapshot date YYYYMMDD for promotion build.
180b57cec5SDimitry Andric #define KMP_VERSION_BUILD 20140926
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric // Helper macros to convert value of macro to string literal.
210b57cec5SDimitry Andric #define _stringer(x) #x
220b57cec5SDimitry Andric #define stringer(x) _stringer(x)
230b57cec5SDimitry Andric 
240b57cec5SDimitry Andric // Detect compiler.
250b57cec5SDimitry Andric #if KMP_COMPILER_ICC
260b57cec5SDimitry Andric #if __INTEL_COMPILER == 1010
270b57cec5SDimitry Andric #define KMP_COMPILER "Intel(R) C++ Compiler 10.1"
280b57cec5SDimitry Andric #elif __INTEL_COMPILER == 1100
290b57cec5SDimitry Andric #define KMP_COMPILER "Intel(R) C++ Compiler 11.0"
300b57cec5SDimitry Andric #elif __INTEL_COMPILER == 1110
310b57cec5SDimitry Andric #define KMP_COMPILER "Intel(R) C++ Compiler 11.1"
320b57cec5SDimitry Andric #elif __INTEL_COMPILER == 1200
330b57cec5SDimitry Andric #define KMP_COMPILER "Intel(R) C++ Compiler 12.0"
340b57cec5SDimitry Andric #elif __INTEL_COMPILER == 1210
350b57cec5SDimitry Andric #define KMP_COMPILER "Intel(R) C++ Compiler 12.1"
360b57cec5SDimitry Andric #elif __INTEL_COMPILER == 1300
370b57cec5SDimitry Andric #define KMP_COMPILER "Intel(R) C++ Compiler 13.0"
380b57cec5SDimitry Andric #elif __INTEL_COMPILER == 1310
390b57cec5SDimitry Andric #define KMP_COMPILER "Intel(R) C++ Compiler 13.1"
400b57cec5SDimitry Andric #elif __INTEL_COMPILER == 1400
410b57cec5SDimitry Andric #define KMP_COMPILER "Intel(R) C++ Compiler 14.0"
420b57cec5SDimitry Andric #elif __INTEL_COMPILER == 1410
430b57cec5SDimitry Andric #define KMP_COMPILER "Intel(R) C++ Compiler 14.1"
440b57cec5SDimitry Andric #elif __INTEL_COMPILER == 1500
450b57cec5SDimitry Andric #define KMP_COMPILER "Intel(R) C++ Compiler 15.0"
460b57cec5SDimitry Andric #elif __INTEL_COMPILER == 1600
470b57cec5SDimitry Andric #define KMP_COMPILER "Intel(R) C++ Compiler 16.0"
480b57cec5SDimitry Andric #elif __INTEL_COMPILER == 1700
490b57cec5SDimitry Andric #define KMP_COMPILER "Intel(R) C++ Compiler 17.0"
500b57cec5SDimitry Andric #elif __INTEL_COMPILER == 1800
510b57cec5SDimitry Andric #define KMP_COMPILER "Intel(R) C++ Compiler 18.0"
520b57cec5SDimitry Andric #elif __INTEL_COMPILER == 1900
530b57cec5SDimitry Andric #define KMP_COMPILER "Intel(R) C++ Compiler 19.0"
54*5f7ddb14SDimitry Andric #elif __INTEL_COMPILER == 1910
55*5f7ddb14SDimitry Andric #define KMP_COMPILER "Intel(R) C++ Compiler 19.1"
560b57cec5SDimitry Andric #elif __INTEL_COMPILER >= 9900
570b57cec5SDimitry Andric #define KMP_COMPILER "Intel(R) C++ Compiler mainline"
580b57cec5SDimitry Andric #endif
590b57cec5SDimitry Andric #elif KMP_COMPILER_CLANG
600b57cec5SDimitry Andric #define KMP_COMPILER                                                           \
610b57cec5SDimitry Andric   "Clang " stringer(__clang_major__) "." stringer(__clang_minor__)
620b57cec5SDimitry Andric #elif KMP_COMPILER_GCC
630b57cec5SDimitry Andric #define KMP_COMPILER "GCC " stringer(__GNUC__) "." stringer(__GNUC_MINOR__)
640b57cec5SDimitry Andric #elif KMP_COMPILER_MSVC
650b57cec5SDimitry Andric #define KMP_COMPILER "MSVC " stringer(_MSC_FULL_VER)
660b57cec5SDimitry Andric #endif
670b57cec5SDimitry Andric #ifndef KMP_COMPILER
680b57cec5SDimitry Andric #warning "Unknown compiler"
690b57cec5SDimitry Andric #define KMP_COMPILER "unknown compiler"
700b57cec5SDimitry Andric #endif
710b57cec5SDimitry Andric 
720b57cec5SDimitry Andric // Detect librray type (perf, stub).
730b57cec5SDimitry Andric #ifdef KMP_STUB
740b57cec5SDimitry Andric #define KMP_LIB_TYPE "stub"
750b57cec5SDimitry Andric #else
760b57cec5SDimitry Andric #define KMP_LIB_TYPE "performance"
770b57cec5SDimitry Andric #endif // KMP_LIB_TYPE
780b57cec5SDimitry Andric 
790b57cec5SDimitry Andric // Detect link type (static, dynamic).
800b57cec5SDimitry Andric #if KMP_DYNAMIC_LIB
810b57cec5SDimitry Andric #define KMP_LINK_TYPE "dynamic"
820b57cec5SDimitry Andric #else
830b57cec5SDimitry Andric #define KMP_LINK_TYPE "static"
840b57cec5SDimitry Andric #endif // KMP_LINK_TYPE
850b57cec5SDimitry Andric 
860b57cec5SDimitry Andric // Finally, define strings.
870b57cec5SDimitry Andric #define KMP_LIBRARY KMP_LIB_TYPE " library (" KMP_LINK_TYPE ")"
880b57cec5SDimitry Andric #define KMP_COPYRIGHT ""
890b57cec5SDimitry Andric 
900b57cec5SDimitry Andric int const __kmp_version_major = KMP_VERSION_MAJOR;
910b57cec5SDimitry Andric int const __kmp_version_minor = KMP_VERSION_MINOR;
920b57cec5SDimitry Andric int const __kmp_version_build = KMP_VERSION_BUILD;
930b57cec5SDimitry Andric int const __kmp_openmp_version = 201611;
940b57cec5SDimitry Andric 
950b57cec5SDimitry Andric /* Do NOT change the format of this string!  Intel(R) Thread Profiler checks for
960b57cec5SDimitry Andric    a specific format some changes in the recognition routine there need to be
970b57cec5SDimitry Andric    made before this is changed. */
980b57cec5SDimitry Andric char const __kmp_copyright[] = KMP_VERSION_PREFIX KMP_LIBRARY
990b57cec5SDimitry Andric     " ver. " stringer(KMP_VERSION_MAJOR) "." stringer(
1000b57cec5SDimitry Andric         KMP_VERSION_MINOR) "." stringer(KMP_VERSION_BUILD) " " KMP_COPYRIGHT;
1010b57cec5SDimitry Andric 
1020b57cec5SDimitry Andric char const __kmp_version_copyright[] = KMP_VERSION_PREFIX KMP_COPYRIGHT;
1030b57cec5SDimitry Andric char const __kmp_version_lib_ver[] =
1040b57cec5SDimitry Andric     KMP_VERSION_PREFIX "version: " stringer(KMP_VERSION_MAJOR) "." stringer(
1050b57cec5SDimitry Andric         KMP_VERSION_MINOR) "." stringer(KMP_VERSION_BUILD);
1060b57cec5SDimitry Andric char const __kmp_version_lib_type[] =
1070b57cec5SDimitry Andric     KMP_VERSION_PREFIX "library type: " KMP_LIB_TYPE;
1080b57cec5SDimitry Andric char const __kmp_version_link_type[] =
1090b57cec5SDimitry Andric     KMP_VERSION_PREFIX "link type: " KMP_LINK_TYPE;
1100b57cec5SDimitry Andric char const __kmp_version_build_time[] = KMP_VERSION_PREFIX "build time: "
1110b57cec5SDimitry Andric                                                            "no_timestamp";
1120b57cec5SDimitry Andric #if KMP_MIC2
1130b57cec5SDimitry Andric char const __kmp_version_target_env[] =
1140b57cec5SDimitry Andric     KMP_VERSION_PREFIX "target environment: MIC2";
1150b57cec5SDimitry Andric #endif
1160b57cec5SDimitry Andric char const __kmp_version_build_compiler[] =
1170b57cec5SDimitry Andric     KMP_VERSION_PREFIX "build compiler: " KMP_COMPILER;
1180b57cec5SDimitry Andric 
1190b57cec5SDimitry Andric // Called at serial initialization time.
1200b57cec5SDimitry Andric static int __kmp_version_1_printed = FALSE;
1210b57cec5SDimitry Andric 
__kmp_print_version_1(void)1220b57cec5SDimitry Andric void __kmp_print_version_1(void) {
1230b57cec5SDimitry Andric   if (__kmp_version_1_printed) {
1240b57cec5SDimitry Andric     return;
1250b57cec5SDimitry Andric   }
1260b57cec5SDimitry Andric   __kmp_version_1_printed = TRUE;
1270b57cec5SDimitry Andric 
1280b57cec5SDimitry Andric #ifndef KMP_STUB
1290b57cec5SDimitry Andric   kmp_str_buf_t buffer;
1300b57cec5SDimitry Andric   __kmp_str_buf_init(&buffer);
1310b57cec5SDimitry Andric   // Print version strings skipping initial magic.
1320b57cec5SDimitry Andric   __kmp_str_buf_print(&buffer, "%s\n",
1330b57cec5SDimitry Andric                       &__kmp_version_lib_ver[KMP_VERSION_MAGIC_LEN]);
1340b57cec5SDimitry Andric   __kmp_str_buf_print(&buffer, "%s\n",
1350b57cec5SDimitry Andric                       &__kmp_version_lib_type[KMP_VERSION_MAGIC_LEN]);
1360b57cec5SDimitry Andric   __kmp_str_buf_print(&buffer, "%s\n",
1370b57cec5SDimitry Andric                       &__kmp_version_link_type[KMP_VERSION_MAGIC_LEN]);
1380b57cec5SDimitry Andric   __kmp_str_buf_print(&buffer, "%s\n",
1390b57cec5SDimitry Andric                       &__kmp_version_build_time[KMP_VERSION_MAGIC_LEN]);
1400b57cec5SDimitry Andric #if KMP_MIC
1410b57cec5SDimitry Andric   __kmp_str_buf_print(&buffer, "%s\n",
1420b57cec5SDimitry Andric                       &__kmp_version_target_env[KMP_VERSION_MAGIC_LEN]);
1430b57cec5SDimitry Andric #endif
1440b57cec5SDimitry Andric   __kmp_str_buf_print(&buffer, "%s\n",
1450b57cec5SDimitry Andric                       &__kmp_version_build_compiler[KMP_VERSION_MAGIC_LEN]);
1460b57cec5SDimitry Andric #if defined(KMP_GOMP_COMPAT)
1470b57cec5SDimitry Andric   __kmp_str_buf_print(&buffer, "%s\n",
1480b57cec5SDimitry Andric                       &__kmp_version_alt_comp[KMP_VERSION_MAGIC_LEN]);
1490b57cec5SDimitry Andric #endif /* defined(KMP_GOMP_COMPAT) */
1500b57cec5SDimitry Andric   __kmp_str_buf_print(&buffer, "%s\n",
1510b57cec5SDimitry Andric                       &__kmp_version_omp_api[KMP_VERSION_MAGIC_LEN]);
1520b57cec5SDimitry Andric   __kmp_str_buf_print(&buffer, "%sdynamic error checking: %s\n",
1530b57cec5SDimitry Andric                       KMP_VERSION_PREF_STR,
1540b57cec5SDimitry Andric                       (__kmp_env_consistency_check ? "yes" : "no"));
1550b57cec5SDimitry Andric #ifdef KMP_DEBUG
1560b57cec5SDimitry Andric   for (int i = bs_plain_barrier; i < bs_last_barrier; ++i) {
1570b57cec5SDimitry Andric     __kmp_str_buf_print(
1580b57cec5SDimitry Andric         &buffer, "%s%s barrier branch bits: gather=%u, release=%u\n",
1590b57cec5SDimitry Andric         KMP_VERSION_PREF_STR, __kmp_barrier_type_name[i],
1600b57cec5SDimitry Andric         __kmp_barrier_gather_branch_bits[i],
1610b57cec5SDimitry Andric         __kmp_barrier_release_branch_bits[i]); // __kmp_str_buf_print
1620b57cec5SDimitry Andric   }
1630b57cec5SDimitry Andric   for (int i = bs_plain_barrier; i < bs_last_barrier; ++i) {
1640b57cec5SDimitry Andric     __kmp_str_buf_print(
1650b57cec5SDimitry Andric         &buffer, "%s%s barrier pattern: gather=%s, release=%s\n",
1660b57cec5SDimitry Andric         KMP_VERSION_PREF_STR, __kmp_barrier_type_name[i],
1670b57cec5SDimitry Andric         __kmp_barrier_pattern_name[__kmp_barrier_gather_pattern[i]],
1680b57cec5SDimitry Andric         __kmp_barrier_pattern_name
1690b57cec5SDimitry Andric             [__kmp_barrier_release_pattern[i]]); // __kmp_str_buf_print
1700b57cec5SDimitry Andric   }
1710b57cec5SDimitry Andric   __kmp_str_buf_print(&buffer, "%s\n",
1720b57cec5SDimitry Andric                       &__kmp_version_lock[KMP_VERSION_MAGIC_LEN]);
1730b57cec5SDimitry Andric #endif
1740b57cec5SDimitry Andric   __kmp_str_buf_print(
1750b57cec5SDimitry Andric       &buffer, "%sthread affinity support: %s\n", KMP_VERSION_PREF_STR,
1760b57cec5SDimitry Andric #if KMP_AFFINITY_SUPPORTED
1770b57cec5SDimitry Andric       (KMP_AFFINITY_CAPABLE()
1780b57cec5SDimitry Andric            ? (__kmp_affinity_type == affinity_none ? "not used" : "yes")
1790b57cec5SDimitry Andric            : "no")
1800b57cec5SDimitry Andric #else
1810b57cec5SDimitry Andric       "no"
1820b57cec5SDimitry Andric #endif
1830b57cec5SDimitry Andric   );
1840b57cec5SDimitry Andric   __kmp_printf("%s", buffer.str);
1850b57cec5SDimitry Andric   __kmp_str_buf_free(&buffer);
1860b57cec5SDimitry Andric   K_DIAG(1, ("KMP_VERSION is true\n"));
1870b57cec5SDimitry Andric #endif // KMP_STUB
1880b57cec5SDimitry Andric } // __kmp_print_version_1
1890b57cec5SDimitry Andric 
1900b57cec5SDimitry Andric // Called at parallel initialization time.
1910b57cec5SDimitry Andric static int __kmp_version_2_printed = FALSE;
1920b57cec5SDimitry Andric 
__kmp_print_version_2(void)1930b57cec5SDimitry Andric void __kmp_print_version_2(void) {
1940b57cec5SDimitry Andric   if (__kmp_version_2_printed) {
1950b57cec5SDimitry Andric     return;
1960b57cec5SDimitry Andric   }
1970b57cec5SDimitry Andric   __kmp_version_2_printed = TRUE;
1980b57cec5SDimitry Andric } // __kmp_print_version_2
1990b57cec5SDimitry Andric 
2000b57cec5SDimitry Andric // end of file //
201