Chris Lattner | 038e05a | 2003-08-01 22:15:41 +0000 | [diff] [blame] | 1 | //===-- Debug.cpp - An easy way to add debug output to your code ----------===// |
Misha Brukman | f976c85 | 2005-04-21 22:55:34 +0000 | [diff] [blame] | 2 | // |
John Criswell | b576c94 | 2003-10-20 19:43:21 +0000 | [diff] [blame] | 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
Chris Lattner | 4ee451d | 2007-12-29 20:36:04 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
Misha Brukman | f976c85 | 2005-04-21 22:55:34 +0000 | [diff] [blame] | 7 | // |
John Criswell | b576c94 | 2003-10-20 19:43:21 +0000 | [diff] [blame] | 8 | //===----------------------------------------------------------------------===// |
Chris Lattner | 038e05a | 2003-08-01 22:15:41 +0000 | [diff] [blame] | 9 | // |
| 10 | // This file implements a handle way of adding debugging information to your |
| 11 | // code, without it being enabled all of the time, and without having to add |
| 12 | // command line options to enable it. |
| 13 | // |
| 14 | // In particular, just wrap your code with the DEBUG() macro, and it will be |
| 15 | // enabled automatically if you specify '-debug' on the command-line. |
| 16 | // Alternatively, you can also use the SET_DEBUG_TYPE("foo") macro to specify |
| 17 | // that your debug code belongs to class "foo". Then, on the command line, you |
| 18 | // can specify '-debug-only=foo' to enable JUST the debug information for the |
| 19 | // foo class. |
| 20 | // |
| 21 | // When compiling in release mode, the -debug-* options and all code in DEBUG() |
| 22 | // statements disappears, so it does not effect the runtime of the code. |
| 23 | // |
| 24 | //===----------------------------------------------------------------------===// |
| 25 | |
Reid Spencer | 551ccae | 2004-09-01 22:55:40 +0000 | [diff] [blame] | 26 | #include "llvm/Support/CommandLine.h" |
Bill Wendling | ab41c3e | 2006-11-17 09:54:47 +0000 | [diff] [blame] | 27 | #include "llvm/Support/Debug.h" |
David Greene | b5d568c | 2009-12-23 16:39:06 +0000 | [diff] [blame] | 28 | #include "llvm/Support/circular_raw_ostream.h" |
| 29 | #include "llvm/System/Signals.h" |
| 30 | |
Chris Lattner | 2cdd21c | 2003-12-14 21:35:53 +0000 | [diff] [blame] | 31 | using namespace llvm; |
Chris Lattner | 038e05a | 2003-08-01 22:15:41 +0000 | [diff] [blame] | 32 | |
Daniel Dunbar | 43ed267 | 2009-08-23 08:50:52 +0000 | [diff] [blame] | 33 | // All Debug.h functionality is a no-op in NDEBUG mode. |
| 34 | #ifndef NDEBUG |
Chris Lattner | 2cdd21c | 2003-12-14 21:35:53 +0000 | [diff] [blame] | 35 | bool llvm::DebugFlag; // DebugFlag - Exported boolean set by the -debug option |
Chris Lattner | 038e05a | 2003-08-01 22:15:41 +0000 | [diff] [blame] | 36 | |
Chris Lattner | a36b81d | 2009-08-23 07:05:39 +0000 | [diff] [blame] | 37 | // -debug - Command line option to enable the DEBUG statements in the passes. |
| 38 | // This flag may only be enabled in debug builds. |
| 39 | static cl::opt<bool, true> |
| 40 | Debug("debug", cl::desc("Enable debug output"), cl::Hidden, |
| 41 | cl::location(DebugFlag)); |
Chris Lattner | 038e05a | 2003-08-01 22:15:41 +0000 | [diff] [blame] | 42 | |
David Greene | b5d568c | 2009-12-23 16:39:06 +0000 | [diff] [blame] | 43 | // -debug-buffer-size - Buffer the last N characters of debug output |
| 44 | //until program termination. |
| 45 | static cl::opt<unsigned> |
| 46 | DebugBufferSize("debug-buffer-size", |
| 47 | cl::desc("Buffer the last N characters of debug output" |
| 48 | "until program termination. " |
| 49 | "[default 0 -- immediate print-out]"), |
| 50 | cl::Hidden, |
| 51 | cl::init(0)); |
| 52 | |
Chris Lattner | a36b81d | 2009-08-23 07:05:39 +0000 | [diff] [blame] | 53 | static std::string CurrentDebugType; |
Dan Gohman | b357983 | 2010-04-15 17:08:50 +0000 | [diff] [blame] | 54 | |
| 55 | namespace { |
| 56 | |
| 57 | struct DebugOnlyOpt { |
Chris Lattner | a36b81d | 2009-08-23 07:05:39 +0000 | [diff] [blame] | 58 | void operator=(const std::string &Val) const { |
| 59 | DebugFlag |= !Val.empty(); |
| 60 | CurrentDebugType = Val; |
| 61 | } |
Dan Gohman | b357983 | 2010-04-15 17:08:50 +0000 | [diff] [blame] | 62 | }; |
| 63 | |
| 64 | } |
| 65 | |
| 66 | static DebugOnlyOpt DebugOnlyOptLoc; |
Chris Lattner | 038e05a | 2003-08-01 22:15:41 +0000 | [diff] [blame] | 67 | |
Chris Lattner | a36b81d | 2009-08-23 07:05:39 +0000 | [diff] [blame] | 68 | static cl::opt<DebugOnlyOpt, true, cl::parser<std::string> > |
| 69 | DebugOnly("debug-only", cl::desc("Enable a specific type of debug output"), |
| 70 | cl::Hidden, cl::value_desc("debug string"), |
| 71 | cl::location(DebugOnlyOptLoc), cl::ValueRequired); |
Chris Lattner | 038e05a | 2003-08-01 22:15:41 +0000 | [diff] [blame] | 72 | |
David Greene | b5d568c | 2009-12-23 16:39:06 +0000 | [diff] [blame] | 73 | // Signal handlers - dump debug output on termination. |
Dan Gohman | 16e0209 | 2010-03-24 19:38:02 +0000 | [diff] [blame] | 74 | static void debug_user_sig_handler(void *Cookie) { |
David Greene | b5d568c | 2009-12-23 16:39:06 +0000 | [diff] [blame] | 75 | // This is a bit sneaky. Since this is under #ifndef NDEBUG, we |
| 76 | // know that debug mode is enabled and dbgs() really is a |
| 77 | // circular_raw_ostream. If NDEBUG is defined, then dbgs() == |
| 78 | // errs() but this will never be invoked. |
| 79 | llvm::circular_raw_ostream *dbgout = |
| 80 | static_cast<llvm::circular_raw_ostream *>(&llvm::dbgs()); |
| 81 | dbgout->flushBufferWithBanner(); |
| 82 | } |
| 83 | |
Chris Lattner | 038e05a | 2003-08-01 22:15:41 +0000 | [diff] [blame] | 84 | // isCurrentDebugType - Return true if the specified string is the debug type |
| 85 | // specified on the command line, or if none was specified on the command line |
| 86 | // with the -debug-only=X option. |
| 87 | // |
Chris Lattner | 2cdd21c | 2003-12-14 21:35:53 +0000 | [diff] [blame] | 88 | bool llvm::isCurrentDebugType(const char *DebugType) { |
Chris Lattner | 038e05a | 2003-08-01 22:15:41 +0000 | [diff] [blame] | 89 | return CurrentDebugType.empty() || DebugType == CurrentDebugType; |
Chris Lattner | 038e05a | 2003-08-01 22:15:41 +0000 | [diff] [blame] | 90 | } |
Chris Lattner | 70197a3 | 2009-10-28 15:32:19 +0000 | [diff] [blame] | 91 | |
| 92 | /// SetCurrentDebugType - Set the current debug type, as if the -debug-only=X |
| 93 | /// option were specified. Note that DebugFlag also needs to be set to true for |
| 94 | /// debug output to be produced. |
| 95 | /// |
Xerxes Ranby | 5aa638d | 2009-11-09 14:50:34 +0000 | [diff] [blame] | 96 | void llvm::SetCurrentDebugType(const char *Type) { |
Chris Lattner | 70197a3 | 2009-10-28 15:32:19 +0000 | [diff] [blame] | 97 | CurrentDebugType = Type; |
| 98 | } |
| 99 | |
David Greene | b5d568c | 2009-12-23 16:39:06 +0000 | [diff] [blame] | 100 | /// dbgs - Return a circular-buffered debug stream. |
| 101 | raw_ostream &llvm::dbgs() { |
| 102 | // Do one-time initialization in a thread-safe way. |
| 103 | static struct dbgstream { |
| 104 | circular_raw_ostream strm; |
| 105 | |
| 106 | dbgstream() : |
| 107 | strm(errs(), "*** Debug Log Output ***\n", |
| 108 | (!EnableDebugBuffering || !DebugFlag) ? 0 : DebugBufferSize) { |
| 109 | if (EnableDebugBuffering && DebugFlag && DebugBufferSize != 0) |
| 110 | // TODO: Add a handler for SIGUSER1-type signals so the user can |
| 111 | // force a debug dump. |
| 112 | sys::AddSignalHandler(&debug_user_sig_handler, 0); |
| 113 | // Otherwise we've already set the debug stream buffer size to |
David Greene | 0377642 | 2009-12-23 23:23:15 +0000 | [diff] [blame] | 114 | // zero, disabling buffering so it will output directly to errs(). |
David Greene | b5d568c | 2009-12-23 16:39:06 +0000 | [diff] [blame] | 115 | } |
| 116 | } thestrm; |
| 117 | |
| 118 | return thestrm.strm; |
| 119 | } |
| 120 | |
Daniel Dunbar | 43ed267 | 2009-08-23 08:50:52 +0000 | [diff] [blame] | 121 | #else |
| 122 | // Avoid "has no symbols" warning. |
Chris Lattner | 70197a3 | 2009-10-28 15:32:19 +0000 | [diff] [blame] | 123 | namespace llvm { |
David Greene | 2ef951e | 2010-01-20 15:27:19 +0000 | [diff] [blame] | 124 | /// dbgs - Return errs(). |
David Greene | b5d568c | 2009-12-23 16:39:06 +0000 | [diff] [blame] | 125 | raw_ostream &dbgs() { |
David Greene | 2ef951e | 2010-01-20 15:27:19 +0000 | [diff] [blame] | 126 | return errs(); |
David Greene | b5d568c | 2009-12-23 16:39:06 +0000 | [diff] [blame] | 127 | } |
Chris Lattner | 70197a3 | 2009-10-28 15:32:19 +0000 | [diff] [blame] | 128 | } |
David Greene | b5d568c | 2009-12-23 16:39:06 +0000 | [diff] [blame] | 129 | |
Daniel Dunbar | 43ed267 | 2009-08-23 08:50:52 +0000 | [diff] [blame] | 130 | #endif |
David Greene | b5d568c | 2009-12-23 16:39:06 +0000 | [diff] [blame] | 131 | |
| 132 | /// EnableDebugBuffering - Turn on signal handler installation. |
| 133 | /// |
| 134 | bool llvm::EnableDebugBuffering = false; |