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