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