1 //===- llvm/Support/Debug.h - Easy way to add debug output ------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements a handy way of adding debugging information to your 10 // code, without it being enabled all of the time, and without having to add 11 // command line options to enable it. 12 // 13 // In particular, just wrap your code with the LLVM_DEBUG() macro, and it will 14 // be enabled automatically if you specify '-debug' on the command-line. 15 // LLVM_DEBUG() requires the DEBUG_TYPE macro to be defined. Set it to "foo" 16 // specify that your debug code belongs to class "foo". Be careful that you only 17 // do this after including Debug.h and not around any #include of headers. 18 // Headers should define and undef the macro acround the code that needs to use 19 // the LLVM_DEBUG() macro. Then, on the command line, you can specify 20 // '-debug-only=foo' to enable JUST the debug information for the foo class. 21 // 22 // When compiling without assertions, the -debug-* options and all code in 23 // LLVM_DEBUG() statements disappears, so it does not affect the runtime of the 24 // code. 25 // 26 //===----------------------------------------------------------------------===// 27 28 #ifndef LLVM_SUPPORT_DEBUG_H 29 #define LLVM_SUPPORT_DEBUG_H 30 31 #include "llvm/Support/Compiler.h" 32 33 namespace llvm { 34 35 class raw_ostream; 36 37 #ifndef NDEBUG 38 39 /// isCurrentDebugType - Return true if the specified string is the debug type 40 /// specified on the command line, or if none was specified on the command line 41 /// with the -debug-only=X option. 42 /// 43 bool isCurrentDebugType(const char *Type); 44 45 /// setCurrentDebugType - Set the current debug type, as if the -debug-only=X 46 /// option were specified. Note that DebugFlag also needs to be set to true for 47 /// debug output to be produced. 48 /// 49 void setCurrentDebugType(const char *Type); 50 51 /// setCurrentDebugTypes - Set the current debug type, as if the 52 /// -debug-only=X,Y,Z option were specified. Note that DebugFlag 53 /// also needs to be set to true for debug output to be produced. 54 /// 55 void setCurrentDebugTypes(const char **Types, unsigned Count); 56 57 /// DEBUG_WITH_TYPE macro - This macro should be used by passes to emit debug 58 /// information. If the '-debug' option is specified on the commandline, and if 59 /// this is a debug build, then the code specified as the option to the macro 60 /// will be executed. Otherwise it will not be. Example: 61 /// 62 /// DEBUG_WITH_TYPE("bitset", dbgs() << "Bitset contains: " << Bitset << "\n"); 63 /// 64 /// This will emit the debug information if -debug is present, and -debug-only 65 /// is not specified, or is specified as "bitset". 66 #define DEBUG_WITH_TYPE(TYPE, ...) \ 67 do { \ 68 if (::llvm::DebugFlag && ::llvm::isCurrentDebugType(TYPE)) { \ 69 __VA_ARGS__; \ 70 } \ 71 } while (false) 72 73 #else 74 #define isCurrentDebugType(X) (false) 75 #define setCurrentDebugType(X) do { (void)(X); } while (false) 76 #define setCurrentDebugTypes(X, N) do { (void)(X); (void)(N); } while (false) 77 #define DEBUG_WITH_TYPE(TYPE, ...) \ 78 do { \ 79 } while (false) 80 #endif 81 82 /// This boolean is set to true if the '-debug' command line option 83 /// is specified. This should probably not be referenced directly, instead, use 84 /// the DEBUG macro below. 85 /// 86 LLVM_ABI extern bool DebugFlag; 87 88 /// EnableDebugBuffering - This defaults to false. If true, the debug 89 /// stream will install signal handlers to dump any buffered debug 90 /// output. It allows clients to selectively allow the debug stream 91 /// to install signal handlers if they are certain there will be no 92 /// conflict. 93 /// 94 LLVM_ABI extern bool EnableDebugBuffering; 95 96 /// dbgs() - This returns a reference to a raw_ostream for debugging 97 /// messages. If debugging is disabled it returns errs(). Use it 98 /// like: dbgs() << "foo" << "bar"; 99 LLVM_ABI raw_ostream &dbgs(); 100 101 // DEBUG macro - This macro should be used by passes to emit debug information. 102 // If the '-debug' option is specified on the commandline, and if this is a 103 // debug build, then the code specified as the option to the macro will be 104 // executed. Otherwise it will not be. Example: 105 // 106 // LLVM_DEBUG(dbgs() << "Bitset contains: " << Bitset << "\n"); 107 // 108 #define LLVM_DEBUG(...) DEBUG_WITH_TYPE(DEBUG_TYPE, __VA_ARGS__) 109 110 } // end namespace llvm 111 112 #endif // LLVM_SUPPORT_DEBUG_H 113