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
31namespace llvm {
32
33class raw_ostream;
34
35#ifndef NDEBUG
36
37/// isCurrentDebugType - Return true if the specified string is the debug type
38/// specified on the command line, or if none was specified on the command line
39/// with the -debug-only=X option.
40///
41bool isCurrentDebugType(const char *Type);
42
43/// setCurrentDebugType - Set the current debug type, as if the -debug-only=X
44/// option were specified. Note that DebugFlag also needs to be set to true for
45/// debug output to be produced.
46///
47void setCurrentDebugType(const char *Type);
48
49/// setCurrentDebugTypes - Set the current debug type, as if the
50/// -debug-only=X,Y,Z option were specified. Note that DebugFlag
51/// also needs to be set to true for debug output to be produced.
52///
53void setCurrentDebugTypes(const char **Types, unsigned Count);
54
55/// DEBUG_WITH_TYPE macro - This macro should be used by passes to emit debug
56/// information. In the '-debug' option is specified on the commandline, and if
57/// this is a debug build, then the code specified as the option to the macro
58/// will be executed. Otherwise it will not be. Example:
59///
60/// DEBUG_WITH_TYPE("bitset", dbgs() << "Bitset contains: " << Bitset << "\n");
61///
62/// This will emit the debug information if -debug is present, and -debug-only
63/// is not specified, or is specified as "bitset".
64#define DEBUG_WITH_TYPE(TYPE, X) \
65 do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType(TYPE)) { X; } \
66 } while (false)
67
68#else
69#define isCurrentDebugType(X) (false)
70#define setCurrentDebugType(X) do { (void)(X); } while (false)
71#define setCurrentDebugTypes(X, N) do { (void)(X); (void)(N); } while (false)
72#define DEBUG_WITH_TYPE(TYPE, X) do { } while (false)
73#endif
74
75/// This boolean is set to true if the '-debug' command line option
76/// is specified. This should probably not be referenced directly, instead, use
77/// the DEBUG macro below.
78///
79extern bool DebugFlag;
80
81/// EnableDebugBuffering - This defaults to false. If true, the debug
82/// stream will install signal handlers to dump any buffered debug
83/// output. It allows clients to selectively allow the debug stream
84/// to install signal handlers if they are certain there will be no
85/// conflict.
86///
87extern bool EnableDebugBuffering;
88
89/// dbgs() - This returns a reference to a raw_ostream for debugging
90/// messages. If debugging is disabled it returns errs(). Use it
91/// like: dbgs() << "foo" << "bar";
92raw_ostream &dbgs();
93
94// DEBUG macro - This macro should be used by passes to emit debug information.
95// In the '-debug' option is specified on the commandline, and if this is a
96// debug build, then the code specified as the option to the macro will be
97// executed. Otherwise it will not be. Example:
98//
99// LLVM_DEBUG(dbgs() << "Bitset contains: " << Bitset << "\n");
100//
101#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
102
103} // end namespace llvm
104
105#endif // LLVM_SUPPORT_DEBUG_H
106

source code of include/llvm-17/llvm/Support/Debug.h