LLVM  14.0.0git
Debug.cpp
Go to the documentation of this file.
1 //===-- Debug.cpp - An easy way to add debug output to your code ----------===//
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 // Alternatively, you can also use the SET_DEBUG_TYPE("foo") macro to specify
16 // that your debug code belongs to class "foo". Then, on the command line, you
17 // can specify '-debug-only=foo' to enable JUST the debug information for the
18 // foo class.
19 //
20 // When compiling without assertions, the -debug-* options and all code in
21 // LLVM_DEBUG() statements disappears, so it does not affect the runtime of the
22 // code.
23 //
24 //===----------------------------------------------------------------------===//
25 
26 #include "llvm/Support/Debug.h"
29 #include "llvm/Support/Signals.h"
32 
33 #include "DebugOptions.h"
34 
35 #undef isCurrentDebugType
36 #undef setCurrentDebugType
37 #undef setCurrentDebugTypes
38 
39 using namespace llvm;
40 
41 // Even though LLVM might be built with NDEBUG, define symbols that the code
42 // built without NDEBUG can depend on via the llvm/Support/Debug.h header.
43 namespace llvm {
44 /// Exported boolean set by the -debug option.
45 bool DebugFlag = false;
46 
48 
49 /// Return true if the specified string is the debug type
50 /// specified on the command line, or if none was specified on the command line
51 /// with the -debug-only=X option.
52 bool isCurrentDebugType(const char *DebugType) {
53  if (CurrentDebugType->empty())
54  return true;
55  // See if DebugType is in list. Note: do not use find() as that forces us to
56  // unnecessarily create an std::string instance.
57  for (auto &d : *CurrentDebugType) {
58  if (d == DebugType)
59  return true;
60  }
61  return false;
62 }
63 
64 /// Set the current debug type, as if the -debug-only=X
65 /// option were specified. Note that DebugFlag also needs to be set to true for
66 /// debug output to be produced.
67 ///
68 void setCurrentDebugTypes(const char **Types, unsigned Count);
69 
70 void setCurrentDebugType(const char *Type) {
72 }
73 
74 void setCurrentDebugTypes(const char **Types, unsigned Count) {
75  CurrentDebugType->clear();
76  for (size_t T = 0; T < Count; ++T)
77  CurrentDebugType->push_back(Types[T]);
78 }
79 } // namespace llvm
80 
81 // All Debug.h functionality is a no-op in NDEBUG mode.
82 #ifndef NDEBUG
83 
84 namespace {
85 struct CreateDebug {
86  static void *call() {
87  return new cl::opt<bool, true>("debug", cl::desc("Enable debug output"),
89  }
90 };
91 
92 // -debug-buffer-size - Buffer the last N characters of debug output
93 //until program termination.
94 struct CreateDebugBufferSize {
95  static void *call() {
96  return new cl::opt<unsigned>(
97  "debug-buffer-size",
98  cl::desc("Buffer the last N characters of debug output "
99  "until program termination. "
100  "[default 0 -- immediate print-out]"),
101  cl::Hidden, cl::init(0));
102  }
103 };
104 } // namespace
105 
106 // -debug - Command line option to enable the DEBUG statements in the passes.
107 // This flag may only be enabled in debug builds.
109 static ManagedStatic<cl::opt<unsigned>, CreateDebugBufferSize> DebugBufferSize;
110 
111 namespace {
112 
113 struct DebugOnlyOpt {
114  void operator=(const std::string &Val) const {
115  if (Val.empty())
116  return;
117  DebugFlag = true;
118  SmallVector<StringRef,8> dbgTypes;
119  StringRef(Val).split(dbgTypes, ',', -1, false);
120  for (auto dbgType : dbgTypes)
121  CurrentDebugType->push_back(std::string(dbgType));
122  }
123 };
124 } // namespace
125 
126 static DebugOnlyOpt DebugOnlyOptLoc;
127 
128 namespace {
129 struct CreateDebugOnly {
130  static void *call() {
132  "debug-only",
133  cl::desc("Enable a specific type of debug output (comma separated list "
134  "of types)"),
135  cl::Hidden, cl::ZeroOrMore, cl::value_desc("debug string"),
137  }
138 };
139 } // namespace
140 
142  CreateDebugOnly>
144 
146  *Debug;
148  *DebugOnly;
149 }
150 
151 // Signal handlers - dump debug output on termination.
152 static void debug_user_sig_handler(void *Cookie) {
153  // This is a bit sneaky. Since this is under #ifndef NDEBUG, we
154  // know that debug mode is enabled and dbgs() really is a
155  // circular_raw_ostream. If NDEBUG is defined, then dbgs() ==
156  // errs() but this will never be invoked.
158  static_cast<circular_raw_ostream &>(llvm::dbgs());
159  dbgout.flushBufferWithBanner();
160 }
161 
162 /// dbgs - Return a circular-buffered debug stream.
164  // Do one-time initialization in a thread-safe way.
165  static struct dbgstream {
167 
168  dbgstream()
169  : strm(errs(), "*** Debug Log Output ***\n",
172  // TODO: Add a handler for SIGUSER1-type signals so the user can
173  // force a debug dump.
175  // Otherwise we've already set the debug stream buffer size to
176  // zero, disabling buffering so it will output directly to errs().
177  }
178  } thestrm;
179 
180  return thestrm.strm;
181 }
182 
183 #else
184 // Avoid "has no symbols" warning.
185 namespace llvm {
186  /// dbgs - Return errs().
187  raw_ostream &dbgs() {
188  return errs();
189  }
190 }
191 void llvm::initDebugOptions() {}
192 #endif
193 
194 /// EnableDebugBuffering - Turn on signal handler installation.
195 ///
Signals.h
llvm
---------------------— PointerInfo ------------------------------------—
Definition: AllocatorList.h:23
llvm::cl::location
LocationClass< Ty > location(Ty &L)
Definition: CommandLine.h:459
llvm::EnableDebugBuffering
bool EnableDebugBuffering
EnableDebugBuffering - This defaults to false.
Definition: Debug.cpp:196
llvm::SmallVector
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1168
DebugBufferSize
static ManagedStatic< cl::opt< unsigned >, CreateDebugBufferSize > DebugBufferSize
Definition: Debug.cpp:109
ManagedStatic.h
llvm::cl::Hidden
@ Hidden
Definition: CommandLine.h:143
llvm::Type
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
DebugOptions.h
llvm::CurrentDebugType
static ManagedStatic< std::vector< std::string > > CurrentDebugType
Definition: Debug.cpp:47
T
#define T
Definition: Mips16ISelLowering.cpp:341
llvm::errs
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
Definition: raw_ostream.cpp:892
DebugOnlyOptLoc
static DebugOnlyOpt DebugOnlyOptLoc
Definition: Debug.cpp:126
llvm::cl::ValueRequired
@ ValueRequired
Definition: CommandLine.h:137
llvm::dbgs
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
CommandLine.h
llvm::COFF::DebugType
DebugType
Definition: COFF.h:652
llvm::StringRef::split
LLVM_NODISCARD std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
Definition: StringRef.h:749
llvm::ManagedStatic
ManagedStatic - This transparently changes the behavior of global statics to be lazily constructed on...
Definition: ManagedStatic.h:83
llvm::raw_ostream
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:53
llvm::circular_raw_ostream
circular_raw_ostream - A raw_ostream which can save its data to a circular buffer,...
Definition: circular_raw_ostream.h:24
llvm::cl::ZeroOrMore
@ ZeroOrMore
Definition: CommandLine.h:120
llvm::cl::opt
Definition: CommandLine.h:1422
llvm::initDebugOptions
void initDebugOptions()
Definition: Debug.cpp:145
llvm::setCurrentDebugType
void setCurrentDebugType(const char *Type)
setCurrentDebugType - Set the current debug type, as if the -debug-only=X option were specified.
Definition: Debug.cpp:70
call
S is passed via registers r2 But gcc stores them to the and then reload them to and r3 before issuing the call(r0 contains the address of the format string)
Definition: README.txt:190
llvm::cl::init
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:443
llvm::sys::AddSignalHandler
void AddSignalHandler(SignalHandlerCallback FnPtr, void *Cookie)
Add a function to be called when an abort/kill signal is delivered to the process.
llvm::isCurrentDebugType
bool isCurrentDebugType(const char *Type)
isCurrentDebugType - Return true if the specified string is the debug type specified on the command l...
Definition: Debug.cpp:52
llvm::StringRef
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:58
llvm::circular_raw_ostream::flushBufferWithBanner
void flushBufferWithBanner()
flushBufferWithBanner - Force output of the buffer along with a small header.
Definition: circular_raw_ostream.cpp:38
llvm::setCurrentDebugTypes
void setCurrentDebugTypes(const char **Types, unsigned Count)
setCurrentDebugTypes - Set the current debug type, as if the -debug-only=X,Y,Z option were specified.
Definition: Debug.cpp:74
circular_raw_ostream.h
llvm::cl::value_desc
Definition: CommandLine.h:424
llvm::DebugFlag
bool DebugFlag
This boolean is set to true if the '-debug' command line option is specified.
Definition: Debug.cpp:45
DebugOnly
static ManagedStatic< cl::opt< DebugOnlyOpt, true, cl::parser< std::string > >, CreateDebugOnly > DebugOnly
Definition: Debug.cpp:143
llvm::cl::desc
Definition: CommandLine.h:414
raw_ostream.h
d
the resulting code requires compare and branches when and if the revised code is with conditional branches instead of More there is a byte word extend before each where there should be only and the condition codes are not remembered when the same two values are compared twice More LSR enhancements i8 and i32 load store addressing modes are identical int int int d
Definition: README.txt:418
Debug.h
Debug
static ManagedStatic< cl::opt< bool, true >, CreateDebug > Debug
Definition: Debug.cpp:108
debug_user_sig_handler
static void debug_user_sig_handler(void *Cookie)
Definition: Debug.cpp:152