1243789Sdim/*===-- ittnotify_config.h - JIT Profiling API internal config-----*- C -*-===*
2243789Sdim *
3243789Sdim *                     The LLVM Compiler Infrastructure
4243789Sdim *
5243789Sdim * This file is distributed under the University of Illinois Open Source
6243789Sdim * License. See LICENSE.TXT for details.
7243789Sdim *
8243789Sdim *===----------------------------------------------------------------------===*
9243789Sdim *
10243789Sdim * This file provides Intel(R) Performance Analyzer JIT (Just-In-Time)
11243789Sdim * Profiling API internal config.
12243789Sdim *
13243789Sdim * NOTE: This file comes in a style different from the rest of LLVM
14243789Sdim * source base since  this is a piece of code shared from Intel(R)
15243789Sdim * products.  Please do not reformat / re-style this code to make
16243789Sdim * subsequent merges and contributions from the original source base eaiser.
17243789Sdim *
18243789Sdim *===----------------------------------------------------------------------===*/
19243789Sdim#ifndef _ITTNOTIFY_CONFIG_H_
20243789Sdim#define _ITTNOTIFY_CONFIG_H_
21243789Sdim
22243789Sdim/** @cond exclude_from_documentation */
23243789Sdim#ifndef ITT_OS_WIN
24243789Sdim#  define ITT_OS_WIN   1
25243789Sdim#endif /* ITT_OS_WIN */
26243789Sdim
27243789Sdim#ifndef ITT_OS_LINUX
28243789Sdim#  define ITT_OS_LINUX 2
29243789Sdim#endif /* ITT_OS_LINUX */
30243789Sdim
31243789Sdim#ifndef ITT_OS_MAC
32243789Sdim#  define ITT_OS_MAC   3
33243789Sdim#endif /* ITT_OS_MAC */
34243789Sdim
35243789Sdim#ifndef ITT_OS
36243789Sdim#  if defined WIN32 || defined _WIN32
37243789Sdim#    define ITT_OS ITT_OS_WIN
38243789Sdim#  elif defined( __APPLE__ ) && defined( __MACH__ )
39243789Sdim#    define ITT_OS ITT_OS_MAC
40243789Sdim#  else
41243789Sdim#    define ITT_OS ITT_OS_LINUX
42243789Sdim#  endif
43243789Sdim#endif /* ITT_OS */
44243789Sdim
45243789Sdim#ifndef ITT_PLATFORM_WIN
46243789Sdim#  define ITT_PLATFORM_WIN 1
47243789Sdim#endif /* ITT_PLATFORM_WIN */
48243789Sdim
49243789Sdim#ifndef ITT_PLATFORM_POSIX
50243789Sdim#  define ITT_PLATFORM_POSIX 2
51243789Sdim#endif /* ITT_PLATFORM_POSIX */
52243789Sdim
53243789Sdim#ifndef ITT_PLATFORM
54243789Sdim#  if ITT_OS==ITT_OS_WIN
55243789Sdim#    define ITT_PLATFORM ITT_PLATFORM_WIN
56243789Sdim#  else
57243789Sdim#    define ITT_PLATFORM ITT_PLATFORM_POSIX
58243789Sdim#  endif /* _WIN32 */
59243789Sdim#endif /* ITT_PLATFORM */
60243789Sdim
61243789Sdim#if defined(_UNICODE) && !defined(UNICODE)
62243789Sdim#define UNICODE
63243789Sdim#endif
64243789Sdim
65243789Sdim#include <stddef.h>
66243789Sdim#if ITT_PLATFORM==ITT_PLATFORM_WIN
67243789Sdim#include <tchar.h>
68243789Sdim#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
69243789Sdim#include <stdint.h>
70243789Sdim#if defined(UNICODE) || defined(_UNICODE)
71243789Sdim#include <wchar.h>
72243789Sdim#endif /* UNICODE || _UNICODE */
73243789Sdim#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
74243789Sdim
75243789Sdim#ifndef CDECL
76243789Sdim#  if ITT_PLATFORM==ITT_PLATFORM_WIN
77243789Sdim#    define CDECL __cdecl
78243789Sdim#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
79243789Sdim#    if defined _M_X64 || defined _M_AMD64 || defined __x86_64__
80243789Sdim#      define CDECL /* not actual on x86_64 platform */
81243789Sdim#    else  /* _M_X64 || _M_AMD64 || __x86_64__ */
82243789Sdim#      define CDECL __attribute__ ((cdecl))
83243789Sdim#    endif /* _M_X64 || _M_AMD64 || __x86_64__ */
84243789Sdim#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
85243789Sdim#endif /* CDECL */
86243789Sdim
87243789Sdim#ifndef STDCALL
88243789Sdim#  if ITT_PLATFORM==ITT_PLATFORM_WIN
89243789Sdim#    define STDCALL __stdcall
90243789Sdim#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
91243789Sdim#    if defined _M_X64 || defined _M_AMD64 || defined __x86_64__
92243789Sdim#      define STDCALL /* not supported on x86_64 platform */
93243789Sdim#    else  /* _M_X64 || _M_AMD64 || __x86_64__ */
94243789Sdim#      define STDCALL __attribute__ ((stdcall))
95243789Sdim#    endif /* _M_X64 || _M_AMD64 || __x86_64__ */
96243789Sdim#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
97243789Sdim#endif /* STDCALL */
98243789Sdim
99243789Sdim#define ITTAPI    CDECL
100243789Sdim#define LIBITTAPI CDECL
101243789Sdim
102243789Sdim/* TODO: Temporary for compatibility! */
103243789Sdim#define ITTAPI_CALL    CDECL
104243789Sdim#define LIBITTAPI_CALL CDECL
105243789Sdim
106243789Sdim#if ITT_PLATFORM==ITT_PLATFORM_WIN
107243789Sdim/* use __forceinline (VC++ specific) */
108243789Sdim#define ITT_INLINE           __forceinline
109243789Sdim#define ITT_INLINE_ATTRIBUTE /* nothing */
110243789Sdim#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
111243789Sdim/*
112243789Sdim * Generally, functions are not inlined unless optimization is specified.
113243789Sdim * For functions declared inline, this attribute inlines the function even
114243789Sdim * if no optimization level was specified.
115243789Sdim */
116243789Sdim#ifdef __STRICT_ANSI__
117243789Sdim#define ITT_INLINE           static
118243789Sdim#else  /* __STRICT_ANSI__ */
119243789Sdim#define ITT_INLINE           static inline
120243789Sdim#endif /* __STRICT_ANSI__ */
121243789Sdim#define ITT_INLINE_ATTRIBUTE __attribute__ ((always_inline))
122243789Sdim#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
123243789Sdim/** @endcond */
124243789Sdim
125243789Sdim#ifndef ITT_ARCH_IA32
126243789Sdim#  define ITT_ARCH_IA32  1
127243789Sdim#endif /* ITT_ARCH_IA32 */
128243789Sdim
129243789Sdim#ifndef ITT_ARCH_IA32E
130243789Sdim#  define ITT_ARCH_IA32E 2
131243789Sdim#endif /* ITT_ARCH_IA32E */
132243789Sdim
133243789Sdim#ifndef ITT_ARCH_IA64
134243789Sdim#  define ITT_ARCH_IA64  3
135243789Sdim#endif /* ITT_ARCH_IA64 */
136243789Sdim
137243789Sdim#ifndef ITT_ARCH
138243789Sdim#  if defined _M_X64 || defined _M_AMD64 || defined __x86_64__
139243789Sdim#    define ITT_ARCH ITT_ARCH_IA32E
140243789Sdim#  elif defined _M_IA64 || defined __ia64
141243789Sdim#    define ITT_ARCH ITT_ARCH_IA64
142243789Sdim#  else
143243789Sdim#    define ITT_ARCH ITT_ARCH_IA32
144243789Sdim#  endif
145243789Sdim#endif
146243789Sdim
147243789Sdim#ifdef __cplusplus
148243789Sdim#  define ITT_EXTERN_C extern "C"
149243789Sdim#else
150243789Sdim#  define ITT_EXTERN_C /* nothing */
151243789Sdim#endif /* __cplusplus */
152243789Sdim
153243789Sdim#define ITT_TO_STR_AUX(x) #x
154243789Sdim#define ITT_TO_STR(x)     ITT_TO_STR_AUX(x)
155243789Sdim
156243789Sdim#define __ITT_BUILD_ASSERT(expr, suffix) do { \
157243789Sdim    static char __itt_build_check_##suffix[(expr) ? 1 : -1]; \
158243789Sdim    __itt_build_check_##suffix[0] = 0; \
159243789Sdim} while(0)
160243789Sdim#define _ITT_BUILD_ASSERT(expr, suffix)  __ITT_BUILD_ASSERT((expr), suffix)
161243789Sdim#define ITT_BUILD_ASSERT(expr)           _ITT_BUILD_ASSERT((expr), __LINE__)
162243789Sdim
163243789Sdim#define ITT_MAGIC { 0xED, 0xAB, 0xAB, 0xEC, 0x0D, 0xEE, 0xDA, 0x30 }
164243789Sdim
165243789Sdim/* Replace with snapshot date YYYYMMDD for promotion build. */
166243789Sdim#define API_VERSION_BUILD    20111111
167243789Sdim
168243789Sdim#ifndef API_VERSION_NUM
169243789Sdim#define API_VERSION_NUM 0.0.0
170243789Sdim#endif /* API_VERSION_NUM */
171243789Sdim
172243789Sdim#define API_VERSION "ITT-API-Version " ITT_TO_STR(API_VERSION_NUM) \
173243789Sdim                                " (" ITT_TO_STR(API_VERSION_BUILD) ")"
174243789Sdim
175243789Sdim/* OS communication functions */
176243789Sdim#if ITT_PLATFORM==ITT_PLATFORM_WIN
177243789Sdim#include <windows.h>
178243789Sdimtypedef HMODULE           lib_t;
179243789Sdimtypedef DWORD             TIDT;
180243789Sdimtypedef CRITICAL_SECTION  mutex_t;
181243789Sdim#define MUTEX_INITIALIZER { 0 }
182243789Sdim#define strong_alias(name, aliasname) /* empty for Windows */
183243789Sdim#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
184243789Sdim#include <dlfcn.h>
185243789Sdim#if defined(UNICODE) || defined(_UNICODE)
186243789Sdim#include <wchar.h>
187243789Sdim#endif /* UNICODE */
188243789Sdim#ifndef _GNU_SOURCE
189243789Sdim#define _GNU_SOURCE 1 /* need for PTHREAD_MUTEX_RECURSIVE */
190243789Sdim#endif /* _GNU_SOURCE */
191243789Sdim#include <pthread.h>
192243789Sdimtypedef void*             lib_t;
193243789Sdimtypedef pthread_t         TIDT;
194243789Sdimtypedef pthread_mutex_t   mutex_t;
195243789Sdim#define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
196243789Sdim#define _strong_alias(name, aliasname) \
197243789Sdim            extern __typeof (name) aliasname __attribute__ ((alias (#name)));
198243789Sdim#define strong_alias(name, aliasname) _strong_alias(name, aliasname)
199243789Sdim#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
200243789Sdim
201243789Sdim#if ITT_PLATFORM==ITT_PLATFORM_WIN
202243789Sdim#define __itt_get_proc(lib, name) GetProcAddress(lib, name)
203243789Sdim#define __itt_mutex_init(mutex)   InitializeCriticalSection(mutex)
204243789Sdim#define __itt_mutex_lock(mutex)   EnterCriticalSection(mutex)
205243789Sdim#define __itt_mutex_unlock(mutex) LeaveCriticalSection(mutex)
206243789Sdim#define __itt_load_lib(name)      LoadLibraryA(name)
207243789Sdim#define __itt_unload_lib(handle)  FreeLibrary(handle)
208243789Sdim#define __itt_system_error()      (int)GetLastError()
209243789Sdim#define __itt_fstrcmp(s1, s2)     lstrcmpA(s1, s2)
210243789Sdim#define __itt_fstrlen(s)          lstrlenA(s)
211243789Sdim#define __itt_fstrcpyn(s1, s2, l) lstrcpynA(s1, s2, l)
212243789Sdim#define __itt_fstrdup(s)          _strdup(s)
213243789Sdim#define __itt_thread_id()         GetCurrentThreadId()
214243789Sdim#define __itt_thread_yield()      SwitchToThread()
215243789Sdim#ifndef ITT_SIMPLE_INIT
216243789SdimITT_INLINE long
217243789Sdim__itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE;
218243789SdimITT_INLINE long __itt_interlocked_increment(volatile long* ptr)
219243789Sdim{
220243789Sdim    return InterlockedIncrement(ptr);
221243789Sdim}
222243789Sdim#endif /* ITT_SIMPLE_INIT */
223243789Sdim#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
224243789Sdim#define __itt_get_proc(lib, name) dlsym(lib, name)
225243789Sdim#define __itt_mutex_init(mutex)   {\
226243789Sdim    pthread_mutexattr_t mutex_attr;                                         \
227243789Sdim    int error_code = pthread_mutexattr_init(&mutex_attr);                   \
228243789Sdim    if (error_code)                                                         \
229243789Sdim        __itt_report_error(__itt_error_system, "pthread_mutexattr_init",    \
230243789Sdim                           error_code);                                     \
231243789Sdim    error_code = pthread_mutexattr_settype(&mutex_attr,                     \
232243789Sdim                                           PTHREAD_MUTEX_RECURSIVE);        \
233243789Sdim    if (error_code)                                                         \
234243789Sdim        __itt_report_error(__itt_error_system, "pthread_mutexattr_settype", \
235243789Sdim                           error_code);                                     \
236243789Sdim    error_code = pthread_mutex_init(mutex, &mutex_attr);                    \
237243789Sdim    if (error_code)                                                         \
238243789Sdim        __itt_report_error(__itt_error_system, "pthread_mutex_init",        \
239243789Sdim                           error_code);                                     \
240243789Sdim    error_code = pthread_mutexattr_destroy(&mutex_attr);                    \
241243789Sdim    if (error_code)                                                         \
242243789Sdim        __itt_report_error(__itt_error_system, "pthread_mutexattr_destroy", \
243243789Sdim                           error_code);                                     \
244243789Sdim}
245243789Sdim#define __itt_mutex_lock(mutex)   pthread_mutex_lock(mutex)
246243789Sdim#define __itt_mutex_unlock(mutex) pthread_mutex_unlock(mutex)
247243789Sdim#define __itt_load_lib(name)      dlopen(name, RTLD_LAZY)
248243789Sdim#define __itt_unload_lib(handle)  dlclose(handle)
249243789Sdim#define __itt_system_error()      errno
250243789Sdim#define __itt_fstrcmp(s1, s2)     strcmp(s1, s2)
251243789Sdim#define __itt_fstrlen(s)          strlen(s)
252243789Sdim#define __itt_fstrcpyn(s1, s2, l) strncpy(s1, s2, l)
253243789Sdim#define __itt_fstrdup(s)          strdup(s)
254243789Sdim#define __itt_thread_id()         pthread_self()
255243789Sdim#define __itt_thread_yield()      sched_yield()
256243789Sdim#if ITT_ARCH==ITT_ARCH_IA64
257243789Sdim#ifdef __INTEL_COMPILER
258243789Sdim#define __TBB_machine_fetchadd4(addr, val) __fetchadd4_acq((void *)addr, val)
259243789Sdim#else  /* __INTEL_COMPILER */
260243789Sdim/* TODO: Add Support for not Intel compilers for IA64 */
261243789Sdim#endif /* __INTEL_COMPILER */
262243789Sdim#else /* ITT_ARCH!=ITT_ARCH_IA64 */
263243789SdimITT_INLINE long
264243789Sdim__TBB_machine_fetchadd4(volatile void* ptr, long addend) ITT_INLINE_ATTRIBUTE;
265243789SdimITT_INLINE long __TBB_machine_fetchadd4(volatile void* ptr, long addend)
266243789Sdim{
267243789Sdim    long result;
268243789Sdim    __asm__ __volatile__("lock\nxadd %0,%1"
269243789Sdim                          : "=r"(result),"=m"(*(long*)ptr)
270243789Sdim                          : "0"(addend), "m"(*(long*)ptr)
271243789Sdim                          : "memory");
272243789Sdim    return result;
273243789Sdim}
274243789Sdim#endif /* ITT_ARCH==ITT_ARCH_IA64 */
275243789Sdim#ifndef ITT_SIMPLE_INIT
276243789SdimITT_INLINE long
277243789Sdim__itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE;
278243789SdimITT_INLINE long __itt_interlocked_increment(volatile long* ptr)
279243789Sdim{
280243789Sdim    return __TBB_machine_fetchadd4(ptr, 1) + 1L;
281243789Sdim}
282243789Sdim#endif /* ITT_SIMPLE_INIT */
283243789Sdim#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
284243789Sdim
285243789Sdimtypedef enum {
286243789Sdim    __itt_collection_normal = 0,
287243789Sdim    __itt_collection_paused = 1
288243789Sdim} __itt_collection_state;
289243789Sdim
290243789Sdimtypedef enum {
291243789Sdim    __itt_thread_normal  = 0,
292243789Sdim    __itt_thread_ignored = 1
293243789Sdim} __itt_thread_state;
294243789Sdim
295243789Sdim#pragma pack(push, 8)
296243789Sdim
297243789Sdimtypedef struct ___itt_thread_info
298243789Sdim{
299243789Sdim    const char* nameA; /*!< Copy of original name in ASCII. */
300243789Sdim#if defined(UNICODE) || defined(_UNICODE)
301243789Sdim    const wchar_t* nameW; /*!< Copy of original name in UNICODE. */
302243789Sdim#else  /* UNICODE || _UNICODE */
303243789Sdim    void* nameW;
304243789Sdim#endif /* UNICODE || _UNICODE */
305243789Sdim    TIDT               tid;
306243789Sdim    __itt_thread_state state;   /*!< Thread state (paused or normal) */
307243789Sdim    int                extra1;  /*!< Reserved to the runtime */
308243789Sdim    void*              extra2;  /*!< Reserved to the runtime */
309243789Sdim    struct ___itt_thread_info* next;
310243789Sdim} __itt_thread_info;
311243789Sdim
312243789Sdim#include "ittnotify_types.h" /* For __itt_group_id definition */
313243789Sdim
314243789Sdimtypedef struct ___itt_api_info_20101001
315243789Sdim{
316243789Sdim    const char*    name;
317243789Sdim    void**         func_ptr;
318243789Sdim    void*          init_func;
319243789Sdim    __itt_group_id group;
320243789Sdim}  __itt_api_info_20101001;
321243789Sdim
322243789Sdimtypedef struct ___itt_api_info
323243789Sdim{
324243789Sdim    const char*    name;
325243789Sdim    void**         func_ptr;
326243789Sdim    void*          init_func;
327243789Sdim    void*          null_func;
328243789Sdim    __itt_group_id group;
329243789Sdim}  __itt_api_info;
330243789Sdim
331243789Sdimstruct ___itt_domain;
332243789Sdimstruct ___itt_string_handle;
333243789Sdim
334243789Sdimtypedef struct ___itt_global
335243789Sdim{
336243789Sdim    unsigned char          magic[8];
337243789Sdim    unsigned long          version_major;
338243789Sdim    unsigned long          version_minor;
339243789Sdim    unsigned long          version_build;
340243789Sdim    volatile long          api_initialized;
341243789Sdim    volatile long          mutex_initialized;
342243789Sdim    volatile long          atomic_counter;
343243789Sdim    mutex_t                mutex;
344243789Sdim    lib_t                  lib;
345243789Sdim    void*                  error_handler;
346243789Sdim    const char**           dll_path_ptr;
347243789Sdim    __itt_api_info*        api_list_ptr;
348243789Sdim    struct ___itt_global*  next;
349243789Sdim    /* Joinable structures below */
350243789Sdim    __itt_thread_info*     thread_list;
351243789Sdim    struct ___itt_domain*  domain_list;
352243789Sdim    struct ___itt_string_handle* string_list;
353243789Sdim    __itt_collection_state state;
354243789Sdim} __itt_global;
355243789Sdim
356243789Sdim#pragma pack(pop)
357243789Sdim
358243789Sdim#define NEW_THREAD_INFO_W(gptr,h,h_tail,t,s,n) { \
359243789Sdim    h = (__itt_thread_info*)malloc(sizeof(__itt_thread_info)); \
360243789Sdim    if (h != NULL) { \
361243789Sdim        h->tid    = t; \
362243789Sdim        h->nameA  = NULL; \
363243789Sdim        h->nameW  = n ? _wcsdup(n) : NULL; \
364243789Sdim        h->state  = s; \
365243789Sdim        h->extra1 = 0;    /* reserved */ \
366243789Sdim        h->extra2 = NULL; /* reserved */ \
367243789Sdim        h->next   = NULL; \
368243789Sdim        if (h_tail == NULL) \
369243789Sdim            (gptr)->thread_list = h; \
370243789Sdim        else \
371243789Sdim            h_tail->next = h; \
372243789Sdim    } \
373243789Sdim}
374243789Sdim
375243789Sdim#define NEW_THREAD_INFO_A(gptr,h,h_tail,t,s,n) { \
376243789Sdim    h = (__itt_thread_info*)malloc(sizeof(__itt_thread_info)); \
377243789Sdim    if (h != NULL) { \
378243789Sdim        h->tid    = t; \
379243789Sdim        h->nameA  = n ? __itt_fstrdup(n) : NULL; \
380243789Sdim        h->nameW  = NULL; \
381243789Sdim        h->state  = s; \
382243789Sdim        h->extra1 = 0;    /* reserved */ \
383243789Sdim        h->extra2 = NULL; /* reserved */ \
384243789Sdim        h->next   = NULL; \
385243789Sdim        if (h_tail == NULL) \
386243789Sdim            (gptr)->thread_list = h; \
387243789Sdim        else \
388243789Sdim            h_tail->next = h; \
389243789Sdim    } \
390243789Sdim}
391243789Sdim
392243789Sdim#define NEW_DOMAIN_W(gptr,h,h_tail,name) { \
393243789Sdim    h = (__itt_domain*)malloc(sizeof(__itt_domain)); \
394243789Sdim    if (h != NULL) { \
395243789Sdim        h->flags  = 0;    /* domain is disabled by default */ \
396243789Sdim        h->nameA  = NULL; \
397243789Sdim        h->nameW  = name ? _wcsdup(name) : NULL; \
398243789Sdim        h->extra1 = 0;    /* reserved */ \
399243789Sdim        h->extra2 = NULL; /* reserved */ \
400243789Sdim        h->next   = NULL; \
401243789Sdim        if (h_tail == NULL) \
402243789Sdim            (gptr)->domain_list = h; \
403243789Sdim        else \
404243789Sdim            h_tail->next = h; \
405243789Sdim    } \
406243789Sdim}
407243789Sdim
408243789Sdim#define NEW_DOMAIN_A(gptr,h,h_tail,name) { \
409243789Sdim    h = (__itt_domain*)malloc(sizeof(__itt_domain)); \
410243789Sdim    if (h != NULL) { \
411243789Sdim        h->flags  = 0;    /* domain is disabled by default */ \
412243789Sdim        h->nameA  = name ? __itt_fstrdup(name) : NULL; \
413243789Sdim        h->nameW  = NULL; \
414243789Sdim        h->extra1 = 0;    /* reserved */ \
415243789Sdim        h->extra2 = NULL; /* reserved */ \
416243789Sdim        h->next   = NULL; \
417243789Sdim        if (h_tail == NULL) \
418243789Sdim            (gptr)->domain_list = h; \
419243789Sdim        else \
420243789Sdim            h_tail->next = h; \
421243789Sdim    } \
422243789Sdim}
423243789Sdim
424243789Sdim#define NEW_STRING_HANDLE_W(gptr,h,h_tail,name) { \
425243789Sdim    h = (__itt_string_handle*)malloc(sizeof(__itt_string_handle)); \
426243789Sdim    if (h != NULL) { \
427243789Sdim        h->strA   = NULL; \
428243789Sdim        h->strW   = name ? _wcsdup(name) : NULL; \
429243789Sdim        h->extra1 = 0;    /* reserved */ \
430243789Sdim        h->extra2 = NULL; /* reserved */ \
431243789Sdim        h->next   = NULL; \
432243789Sdim        if (h_tail == NULL) \
433243789Sdim            (gptr)->string_list = h; \
434243789Sdim        else \
435243789Sdim            h_tail->next = h; \
436243789Sdim    } \
437243789Sdim}
438243789Sdim
439243789Sdim#define NEW_STRING_HANDLE_A(gptr,h,h_tail,name) { \
440243789Sdim    h = (__itt_string_handle*)malloc(sizeof(__itt_string_handle)); \
441243789Sdim    if (h != NULL) { \
442243789Sdim        h->strA   = name ? __itt_fstrdup(name) : NULL; \
443243789Sdim        h->strW   = NULL; \
444243789Sdim        h->extra1 = 0;    /* reserved */ \
445243789Sdim        h->extra2 = NULL; /* reserved */ \
446243789Sdim        h->next   = NULL; \
447243789Sdim        if (h_tail == NULL) \
448243789Sdim            (gptr)->string_list = h; \
449243789Sdim        else \
450243789Sdim            h_tail->next = h; \
451243789Sdim    } \
452243789Sdim}
453243789Sdim
454243789Sdim#endif /* _ITTNOTIFY_CONFIG_H_ */
455