xref: /openbsd-src/gnu/llvm/compiler-rt/lib/orc/debug.h (revision 810390e339a5425391477d5d41c78d7cab2424ac)
1*810390e3Srobert //===- debug.h - Debugging output utilities ---------------------*- C++ -*-===//
2*810390e3Srobert //
3*810390e3Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*810390e3Srobert // See https://llvm.org/LICENSE.txt for license information.
5*810390e3Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*810390e3Srobert //
7*810390e3Srobert //===----------------------------------------------------------------------===//
8*810390e3Srobert //
9*810390e3Srobert // This file is a part of the ORC runtime support library.
10*810390e3Srobert //
11*810390e3Srobert //===----------------------------------------------------------------------===//
12*810390e3Srobert 
13*810390e3Srobert #ifndef ORC_RT_DEBUG_H
14*810390e3Srobert #define ORC_RT_DEBUG_H
15*810390e3Srobert 
16*810390e3Srobert #include <atomic>
17*810390e3Srobert 
18*810390e3Srobert #ifndef NDEBUG
19*810390e3Srobert 
20*810390e3Srobert namespace __orc_rt {
21*810390e3Srobert 
22*810390e3Srobert extern std::atomic<const char *> DebugTypes;
23*810390e3Srobert extern char DebugTypesAll;
24*810390e3Srobert extern char DebugTypesNone;
25*810390e3Srobert 
26*810390e3Srobert const char *initializeDebug();
27*810390e3Srobert bool debugTypeEnabled(const char *Type, const char *Types);
28*810390e3Srobert void printdbg(const char *format, ...);
29*810390e3Srobert 
30*810390e3Srobert } // namespace __orc_rt
31*810390e3Srobert 
32*810390e3Srobert #define ORC_RT_DEBUG_WITH_TYPE(TYPE, X)                                        \
33*810390e3Srobert   do {                                                                         \
34*810390e3Srobert     const char *Types =                                                        \
35*810390e3Srobert         ::__orc_rt::DebugTypes.load(std::memory_order_relaxed);                \
36*810390e3Srobert     if (!Types)                                                                \
37*810390e3Srobert       Types = initializeDebug();                                               \
38*810390e3Srobert     if (Types == &DebugTypesNone)                                              \
39*810390e3Srobert       break;                                                                   \
40*810390e3Srobert     if (Types == &DebugTypesAll ||                                             \
41*810390e3Srobert         ::__orc_rt::debugTypeEnabled(TYPE, Types)) {                           \
42*810390e3Srobert       X;                                                                       \
43*810390e3Srobert     }                                                                          \
44*810390e3Srobert   } while (false)
45*810390e3Srobert 
46*810390e3Srobert #else
47*810390e3Srobert 
48*810390e3Srobert #define ORC_RT_DEBUG_WITH_TYPE(TYPE, X)                                        \
49*810390e3Srobert   do {                                                                         \
50*810390e3Srobert   } while (false)
51*810390e3Srobert 
52*810390e3Srobert #endif // !NDEBUG
53*810390e3Srobert 
54*810390e3Srobert #define ORC_RT_DEBUG(X) ORC_RT_DEBUG_WITH_TYPE(DEBUG_TYPE, X)
55*810390e3Srobert 
56*810390e3Srobert #endif // ORC_RT_COMMON_H
57