gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
debug.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2003-2005 The Regents of The University of Michigan
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met: redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer;
9  * redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution;
12  * neither the name of the copyright holders nor the names of its
13  * contributors may be used to endorse or promote products derived from
14  * this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  * Authors: Nathan Binkert
29  */
30 
31 #include "base/debug.hh"
32 
33 #include <sys/types.h>
34 #include <unistd.h>
35 
36 #include <algorithm>
37 #include <csignal>
38 
39 #include "base/cprintf.hh"
40 #include "base/misc.hh"
41 
42 using namespace std;
43 
44 namespace Debug {
45 
46 //
47 // This function will cause the process to signal itself with a
48 // SIGTRAP which is ignored if not in gdb, but will cause the debugger
49 // to break if in gdb.
50 //
51 void
53 {
54 #ifndef NDEBUG
55  kill(getpid(), SIGTRAP);
56 #else
57  cprintf("Debug::breakpoint suppressed, compiled with NDEBUG\n");
58 #endif
59 }
60 
61 //
62 // Flags for debugging purposes. Primarily for trace.hh
63 //
65 FlagsMap &
67 {
68  static FlagsMap flags;
69  return flags;
70 }
71 
72 bool SimpleFlag::_active = false;
73 
74 Flag *
75 findFlag(const std::string &name)
76 {
77  FlagsMap::iterator i = allFlags().find(name);
78  if (i == allFlags().end())
79  return NULL;
80  return i->second;
81 }
82 
83 Flag::Flag(const char *name, const char *desc)
84  : _name(name), _desc(desc)
85 {
87  allFlags().insert(make_pair(name, this));
88 
89  if (!result.second)
90  panic("Flag %s already defined!", name);
91 
93 }
94 
96 {
97  // should find and remove flag.
98 }
99 
100 void
102 {
103  _active = true;
104  for (auto& i : allFlags())
105  i.second->sync();
106 }
107 
108 void
110 {
111  _active = false;
112  for (auto& i : allFlags())
113  i.second->sync();
114 }
115 
116 void
118 {
119  for (auto& k : _kids)
120  k->enable();
121 }
122 
123 void
125 {
126  for (auto& k : _kids)
127  k->disable();
128 }
129 
130 struct AllFlags : public Flag
131 {
133  : Flag("All", "All Flags")
134  {}
135 
136  void
138  {
139  FlagsMap::iterator i = allFlags().begin();
140  FlagsMap::iterator end = allFlags().end();
141  for (; i != end; ++i)
142  if (i->second != this)
143  i->second->enable();
144  }
145 
146  void
148  {
149  FlagsMap::iterator i = allFlags().begin();
150  FlagsMap::iterator end = allFlags().end();
151  for (; i != end; ++i)
152  if (i->second != this)
153  i->second->disable();
154  }
155 };
156 
158 Flag *const All = &theAllFlags;
159 
160 bool
161 changeFlag(const char *s, bool value)
162 {
163  Flag *f = findFlag(s);
164  if (!f)
165  return false;
166 
167  if (value)
168  f->enable();
169  else
170  f->disable();
171 
172  return true;
173 }
174 
175 } // namespace Debug
176 
177 // add a set of functions that can easily be invoked from gdb
178 void
179 setDebugFlag(const char *string)
180 {
181  Debug::changeFlag(string, true);
182 }
183 
184 void
185 clearDebugFlag(const char *string)
186 {
187  Debug::changeFlag(string, false);
188 }
189 
190 void
192 {
193  using namespace Debug;
194  FlagsMap::iterator i = allFlags().begin();
195  FlagsMap::iterator end = allFlags().end();
196  for (; i != end; ++i) {
197  SimpleFlag *f = dynamic_cast<SimpleFlag *>(i->second);
198  if (f && f->status())
199  cprintf("%s\n", f->name());
200  }
201 }
void disable()
Definition: debug.cc:147
void breakpoint()
Definition: debug.cc:52
const std::string & name()
Definition: trace.cc:49
Flag *const All
Definition: debug.cc:158
Bitfield< 7 > i
Definition: miscregs.hh:1378
STL pair class.
Definition: stl.hh:61
#define panic(...)
Definition: misc.hh:153
int allFlagsVersion
Definition: debug.cc:64
std::map< std::string, Flag * > FlagsMap
Definition: debug.hh:125
bool changeFlag(const char *s, bool value)
Definition: debug.cc:161
static bool _active
Definition: debug.hh:64
Flag * findFlag(const std::string &name)
Definition: debug.cc:75
Bitfield< 6 > f
Definition: miscregs.hh:1379
void setDebugFlag(const char *string)
Definition: debug.cc:179
FlagsMap & allFlags()
Definition: debug.cc:66
virtual void disable()=0
std::vector< Flag * > _kids
Definition: debug.hh:90
Bitfield< 4 > s
Definition: miscregs.hh:1738
virtual void enable()=0
bool status() const
Definition: debug.hh:74
void enable()
Definition: debug.cc:137
Bitfield< 23 > k
Definition: dt_constants.hh:80
virtual ~Flag()
Definition: debug.cc:95
void clearDebugFlag(const char *string)
Definition: debug.cc:185
std::string name() const
Definition: debug.hh:53
static void disableAll()
Definition: debug.cc:109
void cprintf(const char *format, const Args &...args)
Definition: cprintf.hh:155
AllFlags theAllFlags
Definition: debug.cc:157
void dumpDebugFlags()
Definition: debug.cc:191
static void enableAll()
Definition: debug.cc:101

Generated on Fri Jun 9 2017 13:03:40 for gem5 by doxygen 1.8.6