17cc577a4SJonathan Peyton /*
2de4749b7SJonathan Peyton  * kmp_version.cpp
37cc577a4SJonathan Peyton  */
47cc577a4SJonathan Peyton 
57cc577a4SJonathan Peyton //===----------------------------------------------------------------------===//
67cc577a4SJonathan Peyton //
757b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
857b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
957b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
107cc577a4SJonathan Peyton //
117cc577a4SJonathan Peyton //===----------------------------------------------------------------------===//
127cc577a4SJonathan Peyton 
137cc577a4SJonathan Peyton #include "kmp.h"
147cc577a4SJonathan Peyton #include "kmp_io.h"
157cc577a4SJonathan Peyton #include "kmp_version.h"
167cc577a4SJonathan Peyton 
177cc577a4SJonathan Peyton // Replace with snapshot date YYYYMMDD for promotion build.
187cc577a4SJonathan Peyton #define KMP_VERSION_BUILD 20140926
197cc577a4SJonathan Peyton 
207cc577a4SJonathan Peyton // Helper macros to convert value of macro to string literal.
217cc577a4SJonathan Peyton #define _stringer(x) #x
227cc577a4SJonathan Peyton #define stringer(x) _stringer(x)
237cc577a4SJonathan Peyton 
247cc577a4SJonathan Peyton // Detect compiler.
25*1234011bSJonathan Peyton #if KMP_COMPILER_ICX
26*1234011bSJonathan Peyton #define KMP_COMPILER __VERSION__
27*1234011bSJonathan Peyton #elif KMP_COMPILER_ICC
287cc577a4SJonathan Peyton #if __INTEL_COMPILER == 1010
298c432f2dSJonathan Peyton #define KMP_COMPILER "Intel(R) C++ Compiler 10.1"
307cc577a4SJonathan Peyton #elif __INTEL_COMPILER == 1100
318c432f2dSJonathan Peyton #define KMP_COMPILER "Intel(R) C++ Compiler 11.0"
327cc577a4SJonathan Peyton #elif __INTEL_COMPILER == 1110
338c432f2dSJonathan Peyton #define KMP_COMPILER "Intel(R) C++ Compiler 11.1"
347cc577a4SJonathan Peyton #elif __INTEL_COMPILER == 1200
358c432f2dSJonathan Peyton #define KMP_COMPILER "Intel(R) C++ Compiler 12.0"
367cc577a4SJonathan Peyton #elif __INTEL_COMPILER == 1210
378c432f2dSJonathan Peyton #define KMP_COMPILER "Intel(R) C++ Compiler 12.1"
387cc577a4SJonathan Peyton #elif __INTEL_COMPILER == 1300
398c432f2dSJonathan Peyton #define KMP_COMPILER "Intel(R) C++ Compiler 13.0"
407cc577a4SJonathan Peyton #elif __INTEL_COMPILER == 1310
418c432f2dSJonathan Peyton #define KMP_COMPILER "Intel(R) C++ Compiler 13.1"
427cc577a4SJonathan Peyton #elif __INTEL_COMPILER == 1400
438c432f2dSJonathan Peyton #define KMP_COMPILER "Intel(R) C++ Compiler 14.0"
447cc577a4SJonathan Peyton #elif __INTEL_COMPILER == 1410
458c432f2dSJonathan Peyton #define KMP_COMPILER "Intel(R) C++ Compiler 14.1"
467cc577a4SJonathan Peyton #elif __INTEL_COMPILER == 1500
478c432f2dSJonathan Peyton #define KMP_COMPILER "Intel(R) C++ Compiler 15.0"
487cc577a4SJonathan Peyton #elif __INTEL_COMPILER == 1600
498c432f2dSJonathan Peyton #define KMP_COMPILER "Intel(R) C++ Compiler 16.0"
507cc577a4SJonathan Peyton #elif __INTEL_COMPILER == 1700
518c432f2dSJonathan Peyton #define KMP_COMPILER "Intel(R) C++ Compiler 17.0"
52ebbcb439SJonathan Peyton #elif __INTEL_COMPILER == 1800
538c432f2dSJonathan Peyton #define KMP_COMPILER "Intel(R) C++ Compiler 18.0"
547ca09056SJonathan Peyton #elif __INTEL_COMPILER == 1900
557ca09056SJonathan Peyton #define KMP_COMPILER "Intel(R) C++ Compiler 19.0"
56467f3924SHansang Bae #elif __INTEL_COMPILER == 1910
57467f3924SHansang Bae #define KMP_COMPILER "Intel(R) C++ Compiler 19.1"
58*1234011bSJonathan Peyton #elif __INTEL_COMPILER > 1910
59*1234011bSJonathan Peyton #define KMP_COMPILER                                                           \
60*1234011bSJonathan Peyton   "Intel(R) C++ Compiler Classic " stringer(__INTEL_COMPILER) "." stringer(    \
61*1234011bSJonathan Peyton       __INTEL_COMPILER_UPDATE)
627cc577a4SJonathan Peyton #endif
637cc577a4SJonathan Peyton #elif KMP_COMPILER_CLANG
643041982dSJonathan Peyton #define KMP_COMPILER                                                           \
653041982dSJonathan Peyton   "Clang " stringer(__clang_major__) "." stringer(__clang_minor__)
667cc577a4SJonathan Peyton #elif KMP_COMPILER_GCC
677cc577a4SJonathan Peyton #define KMP_COMPILER "GCC " stringer(__GNUC__) "." stringer(__GNUC_MINOR__)
687cc577a4SJonathan Peyton #elif KMP_COMPILER_MSVC
697cc577a4SJonathan Peyton #define KMP_COMPILER "MSVC " stringer(_MSC_FULL_VER)
707cc577a4SJonathan Peyton #endif
717cc577a4SJonathan Peyton #ifndef KMP_COMPILER
727cc577a4SJonathan Peyton #warning "Unknown compiler"
737cc577a4SJonathan Peyton #define KMP_COMPILER "unknown compiler"
747cc577a4SJonathan Peyton #endif
757cc577a4SJonathan Peyton 
767cc577a4SJonathan Peyton // Detect librray type (perf, stub).
777cc577a4SJonathan Peyton #ifdef KMP_STUB
787cc577a4SJonathan Peyton #define KMP_LIB_TYPE "stub"
797cc577a4SJonathan Peyton #else
807cc577a4SJonathan Peyton #define KMP_LIB_TYPE "performance"
817cc577a4SJonathan Peyton #endif // KMP_LIB_TYPE
827cc577a4SJonathan Peyton 
837cc577a4SJonathan Peyton // Detect link type (static, dynamic).
848b3842fcSJonathan Peyton #if KMP_DYNAMIC_LIB
857cc577a4SJonathan Peyton #define KMP_LINK_TYPE "dynamic"
867cc577a4SJonathan Peyton #else
877cc577a4SJonathan Peyton #define KMP_LINK_TYPE "static"
887cc577a4SJonathan Peyton #endif // KMP_LINK_TYPE
897cc577a4SJonathan Peyton 
907cc577a4SJonathan Peyton // Finally, define strings.
917cc577a4SJonathan Peyton #define KMP_LIBRARY KMP_LIB_TYPE " library (" KMP_LINK_TYPE ")"
927cc577a4SJonathan Peyton #define KMP_COPYRIGHT ""
937cc577a4SJonathan Peyton 
947cc577a4SJonathan Peyton int const __kmp_version_major = KMP_VERSION_MAJOR;
957cc577a4SJonathan Peyton int const __kmp_version_minor = KMP_VERSION_MINOR;
967cc577a4SJonathan Peyton int const __kmp_version_build = KMP_VERSION_BUILD;
97e4b4f994SJonathan Peyton int const __kmp_openmp_version = 201611;
987cc577a4SJonathan Peyton 
993041982dSJonathan Peyton /* Do NOT change the format of this string!  Intel(R) Thread Profiler checks for
1003041982dSJonathan Peyton    a specific format some changes in the recognition routine there need to be
1013041982dSJonathan Peyton    made before this is changed. */
1023041982dSJonathan Peyton char const __kmp_copyright[] = KMP_VERSION_PREFIX KMP_LIBRARY
1033041982dSJonathan Peyton     " ver. " stringer(KMP_VERSION_MAJOR) "." stringer(
1043041982dSJonathan Peyton         KMP_VERSION_MINOR) "." stringer(KMP_VERSION_BUILD) " " KMP_COPYRIGHT;
1057cc577a4SJonathan Peyton 
1067cc577a4SJonathan Peyton char const __kmp_version_copyright[] = KMP_VERSION_PREFIX KMP_COPYRIGHT;
1073041982dSJonathan Peyton char const __kmp_version_lib_ver[] =
1083041982dSJonathan Peyton     KMP_VERSION_PREFIX "version: " stringer(KMP_VERSION_MAJOR) "." stringer(
1093041982dSJonathan Peyton         KMP_VERSION_MINOR) "." stringer(KMP_VERSION_BUILD);
1103041982dSJonathan Peyton char const __kmp_version_lib_type[] =
1113041982dSJonathan Peyton     KMP_VERSION_PREFIX "library type: " KMP_LIB_TYPE;
1123041982dSJonathan Peyton char const __kmp_version_link_type[] =
1133041982dSJonathan Peyton     KMP_VERSION_PREFIX "link type: " KMP_LINK_TYPE;
1143041982dSJonathan Peyton char const __kmp_version_build_time[] = KMP_VERSION_PREFIX "build time: "
1153041982dSJonathan Peyton                                                            "no_timestamp";
1167cc577a4SJonathan Peyton #if KMP_MIC2
1173041982dSJonathan Peyton char const __kmp_version_target_env[] =
1183041982dSJonathan Peyton     KMP_VERSION_PREFIX "target environment: MIC2";
1197cc577a4SJonathan Peyton #endif
1203041982dSJonathan Peyton char const __kmp_version_build_compiler[] =
1213041982dSJonathan Peyton     KMP_VERSION_PREFIX "build compiler: " KMP_COMPILER;
1227cc577a4SJonathan Peyton 
1237cc577a4SJonathan Peyton // Called at serial initialization time.
1247cc577a4SJonathan Peyton static int __kmp_version_1_printed = FALSE;
1257cc577a4SJonathan Peyton 
__kmp_print_version_1(void)1263041982dSJonathan Peyton void __kmp_print_version_1(void) {
1277cc577a4SJonathan Peyton   if (__kmp_version_1_printed) {
1287cc577a4SJonathan Peyton     return;
129bd3a7633SJonathan Peyton   }
1307cc577a4SJonathan Peyton   __kmp_version_1_printed = TRUE;
1317cc577a4SJonathan Peyton 
1327cc577a4SJonathan Peyton #ifndef KMP_STUB
1337cc577a4SJonathan Peyton   kmp_str_buf_t buffer;
1347cc577a4SJonathan Peyton   __kmp_str_buf_init(&buffer);
1357cc577a4SJonathan Peyton   // Print version strings skipping initial magic.
1363041982dSJonathan Peyton   __kmp_str_buf_print(&buffer, "%s\n",
1373041982dSJonathan Peyton                       &__kmp_version_lib_ver[KMP_VERSION_MAGIC_LEN]);
1383041982dSJonathan Peyton   __kmp_str_buf_print(&buffer, "%s\n",
1393041982dSJonathan Peyton                       &__kmp_version_lib_type[KMP_VERSION_MAGIC_LEN]);
1403041982dSJonathan Peyton   __kmp_str_buf_print(&buffer, "%s\n",
1413041982dSJonathan Peyton                       &__kmp_version_link_type[KMP_VERSION_MAGIC_LEN]);
1423041982dSJonathan Peyton   __kmp_str_buf_print(&buffer, "%s\n",
1433041982dSJonathan Peyton                       &__kmp_version_build_time[KMP_VERSION_MAGIC_LEN]);
1447cc577a4SJonathan Peyton #if KMP_MIC
1453041982dSJonathan Peyton   __kmp_str_buf_print(&buffer, "%s\n",
1463041982dSJonathan Peyton                       &__kmp_version_target_env[KMP_VERSION_MAGIC_LEN]);
1477cc577a4SJonathan Peyton #endif
1483041982dSJonathan Peyton   __kmp_str_buf_print(&buffer, "%s\n",
1493041982dSJonathan Peyton                       &__kmp_version_build_compiler[KMP_VERSION_MAGIC_LEN]);
1507cc577a4SJonathan Peyton #if defined(KMP_GOMP_COMPAT)
1513041982dSJonathan Peyton   __kmp_str_buf_print(&buffer, "%s\n",
1523041982dSJonathan Peyton                       &__kmp_version_alt_comp[KMP_VERSION_MAGIC_LEN]);
1537cc577a4SJonathan Peyton #endif /* defined(KMP_GOMP_COMPAT) */
1543041982dSJonathan Peyton   __kmp_str_buf_print(&buffer, "%s\n",
1553041982dSJonathan Peyton                       &__kmp_version_omp_api[KMP_VERSION_MAGIC_LEN]);
1563041982dSJonathan Peyton   __kmp_str_buf_print(&buffer, "%sdynamic error checking: %s\n",
1573041982dSJonathan Peyton                       KMP_VERSION_PREF_STR,
1583041982dSJonathan Peyton                       (__kmp_env_consistency_check ? "yes" : "no"));
1597cc577a4SJonathan Peyton #ifdef KMP_DEBUG
1607cc577a4SJonathan Peyton   for (int i = bs_plain_barrier; i < bs_last_barrier; ++i) {
1617cc577a4SJonathan Peyton     __kmp_str_buf_print(
1623041982dSJonathan Peyton         &buffer, "%s%s barrier branch bits: gather=%u, release=%u\n",
1633041982dSJonathan Peyton         KMP_VERSION_PREF_STR, __kmp_barrier_type_name[i],
1647cc577a4SJonathan Peyton         __kmp_barrier_gather_branch_bits[i],
1653041982dSJonathan Peyton         __kmp_barrier_release_branch_bits[i]); // __kmp_str_buf_print
166bd3a7633SJonathan Peyton   }
1677cc577a4SJonathan Peyton   for (int i = bs_plain_barrier; i < bs_last_barrier; ++i) {
1687cc577a4SJonathan Peyton     __kmp_str_buf_print(
1693041982dSJonathan Peyton         &buffer, "%s%s barrier pattern: gather=%s, release=%s\n",
1703041982dSJonathan Peyton         KMP_VERSION_PREF_STR, __kmp_barrier_type_name[i],
1717cc577a4SJonathan Peyton         __kmp_barrier_pattern_name[__kmp_barrier_gather_pattern[i]],
1723041982dSJonathan Peyton         __kmp_barrier_pattern_name
1733041982dSJonathan Peyton             [__kmp_barrier_release_pattern[i]]); // __kmp_str_buf_print
174bd3a7633SJonathan Peyton   }
1753041982dSJonathan Peyton   __kmp_str_buf_print(&buffer, "%s\n",
1763041982dSJonathan Peyton                       &__kmp_version_lock[KMP_VERSION_MAGIC_LEN]);
1777cc577a4SJonathan Peyton #endif
1787cc577a4SJonathan Peyton   __kmp_str_buf_print(
1793041982dSJonathan Peyton       &buffer, "%sthread affinity support: %s\n", KMP_VERSION_PREF_STR,
1807cc577a4SJonathan Peyton #if KMP_AFFINITY_SUPPORTED
1813041982dSJonathan Peyton       (KMP_AFFINITY_CAPABLE()
1823041982dSJonathan Peyton            ? (__kmp_affinity_type == affinity_none ? "not used" : "yes")
1833041982dSJonathan Peyton            : "no")
1847cc577a4SJonathan Peyton #else
1857cc577a4SJonathan Peyton       "no"
1867cc577a4SJonathan Peyton #endif
1877cc577a4SJonathan Peyton   );
1887cc577a4SJonathan Peyton   __kmp_printf("%s", buffer.str);
1897cc577a4SJonathan Peyton   __kmp_str_buf_free(&buffer);
1907cc577a4SJonathan Peyton   K_DIAG(1, ("KMP_VERSION is true\n"));
1917cc577a4SJonathan Peyton #endif // KMP_STUB
1927cc577a4SJonathan Peyton } // __kmp_print_version_1
1937cc577a4SJonathan Peyton 
1947cc577a4SJonathan Peyton // Called at parallel initialization time.
1957cc577a4SJonathan Peyton static int __kmp_version_2_printed = FALSE;
1967cc577a4SJonathan Peyton 
__kmp_print_version_2(void)1973041982dSJonathan Peyton void __kmp_print_version_2(void) {
1987cc577a4SJonathan Peyton   if (__kmp_version_2_printed) {
1997cc577a4SJonathan Peyton     return;
200bd3a7633SJonathan Peyton   }
2017cc577a4SJonathan Peyton   __kmp_version_2_printed = TRUE;
2027cc577a4SJonathan Peyton } // __kmp_print_version_2
2037cc577a4SJonathan Peyton 
2047cc577a4SJonathan Peyton // end of file //
205