timemory 3.3.0
Modular C++ Toolkit for Performance Analysis and Logging. Profiling API and Tools for C, C++, CUDA, Fortran, and Python. The C++ template API is essentially a framework to creating tools: it is designed to provide a unifying interface for recording various performance measurements alongside data logging and interfaces to other tools.
macros.h
Go to the documentation of this file.
1// MIT License
2//
3// Copyright (c) 2020, The Regents of the University of California,
4// through Lawrence Berkeley National Laboratory (subject to receipt of any
5// required approvals from the U.S. Dept. of Energy). All rights reserved.
6//
7// Permission is hereby granted, free of charge, to any person obtaining a copy
8// of this software and associated documentation files (the "Software"), to deal
9// in the Software without restriction, including without limitation the rights
10// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11// copies of the Software, and to permit persons to whom the Software is
12// furnished to do so, subject to the following conditions:
13//
14// The above copyright notice and this permission notice shall be included in all
15// copies or substantial portions of the Software.
16//
17// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23// SOFTWARE.
24
25#pragma once
26
27#define _TIM_STRINGIZE(X) _TIM_STRINGIZE2(X)
28#define _TIM_STRINGIZE2(X) #X
29#define _TIM_VAR_NAME_COMBINE(X, Y) X##Y
30#define _TIM_VARIABLE(Y) _TIM_VAR_NAME_COMBINE(timemory_variable_, Y)
31#define _TIM_SCOPE_DTOR(Y) _TIM_VAR_NAME_COMBINE(timemory_scoped_dtor_, Y)
32#define _TIM_TYPEDEF(Y) _TIM_VAR_NAME_COMBINE(timemory_typedef_, Y)
33#define _TIM_STORAGE_INIT(Y) _TIM_VAR_NAME_COMBINE(timemory_storage_initializer_, Y)
34
35#define _TIM_LINESTR _TIM_STRINGIZE(__LINE__)
36
37#if defined(TIMEMORY_PRETTY_FUNCTION) && !defined(_WINDOWS)
38# define _TIM_FUNC __PRETTY_FUNCTION__
39#elif defined(TIMEMORY_PRETTY_FUNCTION) && defined(_WINDOWS)
40# define _TIM_FUNC __FUNCSIG__
41#else
42# define _TIM_FUNC __FUNCTION__
43#endif
44
45#if defined(DISABLE_TIMEMORY) || defined(TIMEMORY_DISABLED)
46# if !defined(TIMEMORY_SPRINTF)
47# define TIMEMORY_SPRINTF(...)
48# endif
49#else
50# if !defined(TIMEMORY_SPRINTF)
51# define TIMEMORY_SPRINTF(VAR, LEN, FMT, ...) \
52 char VAR[LEN]; \
53 snprintf(VAR, LEN, FMT, __VA_ARGS__);
54# endif
55#endif
56
57#if !defined(TIMEMORY_CODE)
58# if defined(DISABLE_TIMEMORY) || defined(TIMEMORY_DISABLED)
59# define TIMEMORY_CODE(...)
60# else
61# define TIMEMORY_CODE(...) __VA_ARGS__
62# endif
63#endif
64
65//======================================================================================//
66//
67// Operating System
68//
69//======================================================================================//
70
71#if defined(_WIN32) || defined(_WIN64) || defined(WIN32) || defined(WIN64)
72# if !defined(_WINDOWS)
73# define _WINDOWS 1
74# endif
75#elif defined(__APPLE__) || defined(__MACH__)
76# if !defined(_MACOS)
77# define _MACOS 1
78# endif
79# if !defined(_UNIX)
80# define _UNIX 1
81# endif
82#elif defined(__linux__) || defined(__linux) || defined(linux) || defined(__gnu_linux__)
83# if !defined(_LINUX)
84# define _LINUX 1
85# endif
86# if !defined(_UNIX)
87# define _UNIX 1
88# endif
89#elif defined(__unix__) || defined(__unix) || defined(unix)
90# if !defined(_UNIX)
91# define _UNIX 1
92# endif
93#endif
94
95#if defined(_WIN32) || defined(_WIN64) || defined(WIN32) || defined(WIN64)
96# if !defined(TIMEMORY_WINDOWS)
97# define TIMEMORY_WINDOWS 1
98# endif
99#elif defined(__APPLE__) || defined(__MACH__)
100# if !defined(TIMEMORY_MACOS)
101# define TIMEMORY_MACOS 1
102# endif
103# if !defined(TIMEMORY_UNIX)
104# define TIMEMORY_UNIX 1
105# endif
106#elif defined(__linux__) || defined(__linux) || defined(linux) || defined(__gnu_linux__)
107# if !defined(TIMEMORY_LINUX)
108# define TIMEMORY_LINUX 1
109# endif
110# if !defined(TIMEMORY_UNIX)
111# define TIMEMORY_UNIX 1
112# endif
113#elif defined(__unix__) || defined(__unix) || defined(unix)
114# if !defined(TIMEMORY_UNIX)
115# define TIMEMORY_UNIX 1
116# endif
117#endif
118
119//======================================================================================//
120//
121// General attribute
122//
123//======================================================================================//
124
125#if !defined(TIMEMORY_ATTRIBUTE)
126# if !defined(_MSC_VER)
127# define TIMEMORY_ATTRIBUTE(attr) __attribute__((attr))
128# else
129# define TIMEMORY_ATTRIBUTE(attr) __declspec(attr)
130# endif
131#endif
132
133//======================================================================================//
134//
135// Windows DLL settings
136//
137//======================================================================================//
138
139#if !defined(TIMEMORY_CDLL)
140# if defined(_WINDOWS)
141# if defined(TIMEMORY_CDLL_EXPORT)
142# define TIMEMORY_CDLL __declspec(dllexport)
143# elif defined(TIMEMORY_CDLL_IMPORT)
144# define TIMEMORY_CDLL __declspec(dllimport)
145# else
146# define TIMEMORY_CDLL
147# endif
148# else
149# define TIMEMORY_CDLL
150# endif
151#endif
152
153#if !defined(TIMEMORY_DLL)
154# if defined(_WINDOWS)
155# if defined(TIMEMORY_DLL_EXPORT)
156# define TIMEMORY_DLL __declspec(dllexport)
157# elif defined(TIMEMORY_DLL_IMPORT)
158# define TIMEMORY_DLL __declspec(dllimport)
159# else
160# define TIMEMORY_DLL
161# endif
162# else
163# define TIMEMORY_DLL
164# endif
165#endif
166
167//======================================================================================//
168//
169// Visibility
170//
171//======================================================================================//
172
173#if !defined(TIMEMORY_VISIBILITY)
174# if !defined(_MSC_VER)
175# define TIMEMORY_VISIBILITY(mode) TIMEMORY_ATTRIBUTE(visibility(mode))
176# else
177# define TIMEMORY_VISIBILITY(mode)
178# endif
179#endif
180
181#if !defined(TIMEMORY_VISIBLE)
182# define TIMEMORY_VISIBLE TIMEMORY_VISIBILITY("default")
183#endif
184
185#if !defined(TIMEMORY_HIDDEN)
186# define TIMEMORY_HIDDEN TIMEMORY_VISIBILITY("hidden")
187#endif
188
189//======================================================================================//
190//
191// Instrumentation
192//
193//======================================================================================//
194
195#if !defined(_WINDOWS)
196# if !defined(TIMEMORY_NEVER_INSTRUMENT)
197# if defined(__clang__)
198# define TIMEMORY_NEVER_INSTRUMENT \
199 TIMEMORY_ATTRIBUTE(no_instrument_function) \
200 TIMEMORY_ATTRIBUTE(xray_never_instrument)
201# else
202# define TIMEMORY_NEVER_INSTRUMENT TIMEMORY_ATTRIBUTE(no_instrument_function)
203# endif
204# endif
205//
206# if !defined(TIMEMORY_INSTRUMENT)
207# define TIMEMORY_INSTRUMENT TIMEMORY_ATTRIBUTE(xray_always_instrument)
208# endif
209#else
210# if !defined(TIMEMORY_NEVER_INSTRUMENT)
211# define TIMEMORY_NEVER_INSTRUMENT
212# endif
213//
214# if !defined(TIMEMORY_INSTRUMENT)
215# define TIMEMORY_INSTRUMENT
216# endif
217#endif
218
219//======================================================================================//
220//
221// Symbol override
222//
223//======================================================================================//
224
225#if !defined(TIMEMORY_WEAK_PREFIX)
226# if !defined(_MSC_VER)
227# if defined(__clang__) && defined(__APPLE__)
228# define TIMEMORY_WEAK_PREFIX
229# else
230# define TIMEMORY_WEAK_PREFIX TIMEMORY_ATTRIBUTE(weak)
231# endif
232# else
233# define TIMEMORY_WEAK_PREFIX
234# endif
235#endif
236
237#if !defined(TIMEMORY_WEAK_POSTFIX)
238# if !defined(_MSC_VER)
239# if defined(__clang__) && defined(__APPLE__)
240# define TIMEMORY_WEAK_POSTFIX TIMEMORY_ATTRIBUTE(weak_import)
241# else
242# define TIMEMORY_WEAK_POSTFIX
243# endif
244# else
245# define TIMEMORY_WEAK_POSTFIX
246# endif
247#endif
248
249//======================================================================================//
250//
251// Library Constructor/Destructor
252//
253//======================================================================================//
254
255#if !defined(TIMEMORY_CTOR)
256# if !defined(_WINDOWS)
257# define TIMEMORY_CTOR TIMEMORY_ATTRIBUTE(constructor)
258# else
259# define TIMEMORY_CTOR
260# endif
261#endif
262//
263//--------------------------------------------------------------------------------------//
264//
265#if !defined(TIMEMORY_DTOR)
266# if !defined(_WINDOWS)
267# define TIMEMORY_DTOR TIMEMORY_ATTRIBUTE(destructor)
268# else
269# define TIMEMORY_DTOR
270# endif
271#endif
272
273//======================================================================================//
274//
275// WINDOWS WARNINGS (apply to C code)
276//
277//======================================================================================//
278
279// MSVC compiler
280#if defined(_MSC_VER) && _MSC_VER > 0 && !defined(TIMEMORY_MSVC_COMPILER)
281# define TIMEMORY_MSVC_COMPILER
282#endif
283
284#if defined(TIMEMORY_MSVC_COMPILER) && !defined(TIMEMORY_MSVC_WARNINGS)
285
286# pragma warning(disable : 4996) // function may be unsafe
287# pragma warning(disable : 5105) // macro produce 'defined' has undefined behavior
288
289#endif