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