1 #include "kmp_config.h"
2 
3 #if USE_ITT_BUILD
4 /*
5  * kmp_itt.cpp -- ITT Notify interface.
6  */
7 
8 
9 //===----------------------------------------------------------------------===//
10 //
11 //                     The LLVM Compiler Infrastructure
12 //
13 // This file is dual licensed under the MIT and the University of Illinois Open
14 // Source Licenses. See LICENSE.txt for details.
15 //
16 //===----------------------------------------------------------------------===//
17 
18 
19 #include "kmp_itt.h"
20 
21 #if KMP_DEBUG
22 #include "kmp_itt.inl"
23 #endif
24 
25 #if USE_ITT_NOTIFY
26 
27 kmp_int32 __kmp_barrier_domain_count;
28 kmp_int32 __kmp_region_domain_count;
29 __itt_domain *__kmp_itt_barrier_domains[KMP_MAX_FRAME_DOMAINS];
30 __itt_domain *__kmp_itt_region_domains[KMP_MAX_FRAME_DOMAINS];
31 __itt_domain *__kmp_itt_imbalance_domains[KMP_MAX_FRAME_DOMAINS];
32 kmp_int32 __kmp_itt_region_team_size[KMP_MAX_FRAME_DOMAINS];
33 __itt_domain *metadata_domain = NULL;
34 __itt_string_handle *string_handle_imbl = NULL;
35 __itt_string_handle *string_handle_loop = NULL;
36 __itt_string_handle *string_handle_sngl = NULL;
37 
38 #include "kmp_i18n.h"
39 #include "kmp_str.h"
40 #include "kmp_version.h"
41 
42 KMP_BUILD_ASSERT(sizeof(kmp_itt_mark_t) == sizeof(__itt_mark_type));
43 
44 /* Previously used warnings:
45 
46    KMP_WARNING( IttAllNotifDisabled );
47    KMP_WARNING( IttObjNotifDisabled );
48    KMP_WARNING( IttMarkNotifDisabled );
49    KMP_WARNING( IttUnloadLibFailed, libittnotify );
50 */
51 
52 kmp_int32 __kmp_itt_prepare_delay = 0;
53 kmp_bootstrap_lock_t __kmp_itt_debug_lock =
54     KMP_BOOTSTRAP_LOCK_INITIALIZER(__kmp_itt_debug_lock);
55 
56 #endif // USE_ITT_NOTIFY
57 
58 void __kmp_itt_initialize() {
59 
60 // ITTNotify library is loaded and initialized at first call to any ittnotify
61 // function, so we do not need to explicitly load it any more. Just report OMP
62 // RTL version to ITTNotify.
63 
64 #if USE_ITT_NOTIFY
65   // Report OpenMP RTL version.
66   kmp_str_buf_t buf;
67   __itt_mark_type version;
68   __kmp_str_buf_init(&buf);
69   __kmp_str_buf_print(&buf, "OMP RTL Version %d.%d.%d", __kmp_version_major,
70                       __kmp_version_minor, __kmp_version_build);
71   if (__itt_api_version_ptr != NULL) {
72     __kmp_str_buf_print(&buf, ":%s", __itt_api_version());
73   }; // if
74   version = __itt_mark_create(buf.str);
75   __itt_mark(version, NULL);
76   __kmp_str_buf_free(&buf);
77 #endif
78 
79 } // __kmp_itt_initialize
80 
81 void __kmp_itt_destroy() {
82 #if USE_ITT_NOTIFY
83   __kmp_itt_fini_ittlib();
84 #endif
85 } // __kmp_itt_destroy
86 
87 extern "C" void __itt_error_handler(__itt_error_code err, va_list args) {
88 
89   switch (err) {
90   case __itt_error_no_module: {
91     char const *library = va_arg(args, char const *);
92 #if KMP_OS_WINDOWS
93     int sys_err = va_arg(args, int);
94     kmp_msg_t err_code = KMP_SYSERRCODE(sys_err);
95     __kmp_msg(kmp_ms_warning, KMP_MSG(IttLoadLibFailed, library), err_code,
96               __kmp_msg_null);
97     if (__kmp_generate_warnings == kmp_warnings_off) {
98       __kmp_str_free(&err_code.str);
99     }
100 #else
101     char const *sys_err = va_arg(args, char const *);
102     kmp_msg_t err_code = KMP_SYSERRMESG(sys_err);
103     __kmp_msg(kmp_ms_warning, KMP_MSG(IttLoadLibFailed, library), err_code,
104               __kmp_msg_null);
105     if (__kmp_generate_warnings == kmp_warnings_off) {
106       __kmp_str_free(&err_code.str);
107     }
108 #endif
109   } break;
110   case __itt_error_no_symbol: {
111     char const *library = va_arg(args, char const *);
112     char const *symbol = va_arg(args, char const *);
113     KMP_WARNING(IttLookupFailed, symbol, library);
114   } break;
115   case __itt_error_unknown_group: {
116     char const *var = va_arg(args, char const *);
117     char const *group = va_arg(args, char const *);
118     KMP_WARNING(IttUnknownGroup, var, group);
119   } break;
120   case __itt_error_env_too_long: {
121     char const *var = va_arg(args, char const *);
122     size_t act_len = va_arg(args, size_t);
123     size_t max_len = va_arg(args, size_t);
124     KMP_WARNING(IttEnvVarTooLong, var, (unsigned long)act_len,
125                 (unsigned long)max_len);
126   } break;
127   case __itt_error_cant_read_env: {
128     char const *var = va_arg(args, char const *);
129     int sys_err = va_arg(args, int);
130     kmp_msg_t err_code = KMP_ERR(sys_err);
131     __kmp_msg(kmp_ms_warning, KMP_MSG(CantGetEnvVar, var), err_code,
132               __kmp_msg_null);
133     if (__kmp_generate_warnings == kmp_warnings_off) {
134       __kmp_str_free(&err_code.str);
135     }
136   } break;
137   case __itt_error_system: {
138     char const *func = va_arg(args, char const *);
139     int sys_err = va_arg(args, int);
140     kmp_msg_t err_code = KMP_SYSERRCODE(sys_err);
141     __kmp_msg(kmp_ms_warning, KMP_MSG(IttFunctionError, func), err_code,
142               __kmp_msg_null);
143     if (__kmp_generate_warnings == kmp_warnings_off) {
144       __kmp_str_free(&err_code.str);
145     }
146   } break;
147   default: { KMP_WARNING(IttUnknownError, err); };
148   }; // switch
149 } // __itt_error_handler
150 
151 #endif /* USE_ITT_BUILD */
152