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 
26 #if USE_ITT_NOTIFY
27 
28     kmp_int32 __kmp_barrier_domain_count;
29     kmp_int32 __kmp_region_domain_count;
30     __itt_domain* __kmp_itt_barrier_domains[KMP_MAX_FRAME_DOMAINS];
31     __itt_domain* __kmp_itt_region_domains[KMP_MAX_FRAME_DOMAINS];
32     __itt_domain* __kmp_itt_imbalance_domains[KMP_MAX_FRAME_DOMAINS];
33     kmp_int32 __kmp_itt_region_team_size[KMP_MAX_FRAME_DOMAINS];
34     __itt_domain * metadata_domain = NULL;
35     __itt_string_handle * string_handle_imbl = NULL;
36     __itt_string_handle * string_handle_loop = NULL;
37     __itt_string_handle * string_handle_sngl = NULL;
38 
39     #include "kmp_version.h"
40     #include "kmp_i18n.h"
41     #include "kmp_str.h"
42 
43     KMP_BUILD_ASSERT( sizeof( kmp_itt_mark_t ) == sizeof( __itt_mark_type ) );
44 
45     /*
46         Previously used warnings:
47 
48         KMP_WARNING( IttAllNotifDisabled );
49         KMP_WARNING( IttObjNotifDisabled );
50         KMP_WARNING( IttMarkNotifDisabled );
51         KMP_WARNING( IttUnloadLibFailed, libittnotify );
52     */
53 
54 
55     kmp_int32 __kmp_itt_prepare_delay = 0;
56     kmp_bootstrap_lock_t __kmp_itt_debug_lock = KMP_BOOTSTRAP_LOCK_INITIALIZER( __kmp_itt_debug_lock );
57 
58 #endif // USE_ITT_NOTIFY
59 
60 void __kmp_itt_initialize() {
61 
62     // ITTNotify library is loaded and initialized at first call to any ittnotify function,
63     // so we do not need to explicitly load it any more.
64     // Jusr report OMP RTL version to ITTNotify.
65 
66     #if USE_ITT_NOTIFY
67         // Report OpenMP RTL version.
68         kmp_str_buf_t       buf;
69         __itt_mark_type     version;
70         __kmp_str_buf_init( & buf );
71         __kmp_str_buf_print(
72             & buf,
73             "OMP RTL Version %d.%d.%d",
74             __kmp_version_major,
75             __kmp_version_minor,
76             __kmp_version_build
77         );
78         if ( __itt_api_version_ptr != NULL ) {
79             __kmp_str_buf_print( & buf, ":%s", __itt_api_version() );
80         }; // if
81         version = __itt_mark_create( buf.str );
82         __itt_mark( version, NULL );
83         __kmp_str_buf_free( & buf );
84     #endif
85 
86 } // __kmp_itt_initialize
87 
88 
89 void __kmp_itt_destroy() {
90     #if USE_ITT_NOTIFY
91         __kmp_itt_fini_ittlib();
92     #endif
93 } // __kmp_itt_destroy
94 
95 
96 extern "C"
97 void
98 __itt_error_handler(
99     __itt_error_code err,
100     va_list args
101 ) {
102 
103     switch ( err ) {
104         case __itt_error_no_module : {
105             char const * library = va_arg( args, char const * );
106 #if KMP_OS_WINDOWS
107             int sys_err = va_arg( args, int );
108             kmp_msg_t err_code = KMP_SYSERRCODE( sys_err );
109             __kmp_msg( kmp_ms_warning, KMP_MSG( IttLoadLibFailed, library ), err_code, __kmp_msg_null );
110             if (__kmp_generate_warnings == kmp_warnings_off) {
111               __kmp_str_free(&err_code.str);
112             }
113 #else
114             char const * sys_err = va_arg( args, char const * );
115             kmp_msg_t err_code = KMP_SYSERRMESG( sys_err );
116             __kmp_msg( kmp_ms_warning, KMP_MSG( IttLoadLibFailed, library ), err_code, __kmp_msg_null );
117             if (__kmp_generate_warnings == kmp_warnings_off) {
118               __kmp_str_free(&err_code.str);
119             }
120 #endif
121         } break;
122         case __itt_error_no_symbol : {
123             char const * library = va_arg( args, char const * );
124             char const * symbol  = va_arg( args, char const * );
125             KMP_WARNING( IttLookupFailed, symbol, library );
126         } break;
127         case __itt_error_unknown_group : {
128             char const * var   = va_arg( args, char const * );
129             char const * group = va_arg( args, char const * );
130             KMP_WARNING( IttUnknownGroup, var, group );
131         } break;
132         case __itt_error_env_too_long : {
133             char const * var     = va_arg( args, char const * );
134             size_t       act_len = va_arg( args, size_t );
135             size_t       max_len = va_arg( args, size_t );
136             KMP_WARNING( IttEnvVarTooLong, var, (unsigned long) act_len, (unsigned long) max_len );
137         } break;
138         case __itt_error_cant_read_env : {
139             char const * var     = va_arg( args, char const * );
140             int          sys_err = va_arg( args, int );
141             kmp_msg_t err_code = KMP_ERR( sys_err );
142             __kmp_msg( kmp_ms_warning, KMP_MSG( CantGetEnvVar, var ), err_code, __kmp_msg_null );
143             if (__kmp_generate_warnings == kmp_warnings_off) {
144               __kmp_str_free(&err_code.str);
145             }
146         } break;
147         case __itt_error_system : {
148             char const * func    = va_arg( args, char const * );
149             int          sys_err = va_arg( args, int );
150             kmp_msg_t err_code = KMP_SYSERRCODE( sys_err );
151             __kmp_msg( kmp_ms_warning, KMP_MSG( IttFunctionError, func ), err_code, __kmp_msg_null );
152             if (__kmp_generate_warnings == kmp_warnings_off) {
153               __kmp_str_free(&err_code.str);
154             }
155         } break;
156         default : {
157             KMP_WARNING( IttUnknownError, err );
158         };
159     }; // switch
160 
161 } // __itt_error_handler
162 
163 #endif /* USE_ITT_BUILD */
164