From 3711ea7347b02b8e27f5959d453cb8c9a291a753 Mon Sep 17 00:00:00 2001 From: Nathan Binkert Date: Fri, 30 Jul 2004 10:47:53 -0400 Subject: [PATCH] Move all of the object matching code to a shared file so it can be more easily re-used. This currently uses some cooked up matching function that I wrote a while ago, but should probably be changed to use regular expressions in the future. add doDebugBreak to control breakpoints on a per SimObject basis SConscript: add match base/stats/events.cc: base/trace.cc: Move the object matching code into a separate file so it can be more easily shared base/trace.hh: the object matching code was wrapped up and moved. adapt. sim/sim_object.cc: add the doDebugBreak flag that can be set on a per-SimObject basis. This will be used in the future to control whether or not debug_break() will actually break for a given object. provide a function interface that can be called from the debugger. sim/sim_object.hh: add the doDebugBreak flag that can be set on a per-SimObject basis. This will be used in the future to control whether or not debug_break() will actually break for a given object. --HG-- extra : convert_revision : 6bf7924de63d41f5ba6b80d579efdf26ba265a8f --- SConscript | 1 + base/match.cc | 96 ++++++++++++++++++++++++++++++++++++++++++++ base/match.hh | 57 ++++++++++++++++++++++++++ base/stats/events.cc | 36 ++--------------- base/trace.cc | 34 +--------------- base/trace.hh | 8 ++-- sim/sim_object.cc | 36 ++++++++++++++++- sim/sim_object.hh | 6 +++ 8 files changed, 202 insertions(+), 72 deletions(-) create mode 100644 base/match.cc create mode 100644 base/match.hh diff --git a/SConscript b/SConscript index 3c6bbf83e..d1f4bc0b7 100644 --- a/SConscript +++ b/SConscript @@ -59,6 +59,7 @@ base_sources = Split(''' base/hybrid_pred.cc base/inifile.cc base/intmath.cc + base/match.cc base/misc.cc base/pollevent.cc base/python.cc diff --git a/base/match.cc b/base/match.cc new file mode 100644 index 000000000..ba5c2181c --- /dev/null +++ b/base/match.cc @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2001-2004 The Regents of The University of Michigan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "base/match.hh" +#include "base/str.hh" + +using namespace std; + +ObjectMatch::ObjectMatch() +{ +} + +ObjectMatch::ObjectMatch(const string &expr) +{ + setExpression(expr); +} + +void +ObjectMatch::setExpression(const string &expr) +{ + tokens.resize(1); + tokenize(tokens[0], expr, '.'); +} + +void +ObjectMatch::setExpression(const vector &expr) +{ + if (expr.empty()) { + tokens.resize(0); + } else { + tokens.resize(expr.size()); + for (int i = 0; i < expr.size(); ++i) + tokenize(tokens[i], expr[i], '.'); + } +} + +/** + * @todo this should probably be changed to just use regular + * expression code + */ +bool +ObjectMatch::domatch(const string &name) const +{ + vector name_tokens; + tokenize(name_tokens, name, '.'); + int ntsize = name_tokens.size(); + + int num_expr = tokens.size(); + for (int i = 0; i < num_expr; ++i) { + const vector &token = tokens[i]; + int jstop = token.size(); + + bool match = true; + for (int j = 0; j < jstop; ++j) { + if (j >= ntsize) + break; + + const string &var = token[j]; + if (var != "*" && var != name_tokens[j]) { + match = false; + break; + } + } + + if (match == true) + return true; + } + + return false; +} + diff --git a/base/match.hh b/base/match.hh new file mode 100644 index 000000000..8831ed424 --- /dev/null +++ b/base/match.hh @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2001-2004 The Regents of The University of Michigan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* @file + * User Console Definitions + */ + +#ifndef __BASE_MATCH_HH__ +#define __BASE_MATCH_HH__ + +#include +#include + +class ObjectMatch +{ + protected: + std::vector > tokens; + bool domatch(const std::string &name) const; + + public: + ObjectMatch(); + ObjectMatch(const std::string &expression); + void setExpression(const std::string &expression); + void setExpression(const std::vector &expression); + bool match(const std::string &name) const + { + return tokens.empty() ? false : domatch(name); + } +}; + +#endif // __BASE_MATCH_HH__ + diff --git a/base/stats/events.cc b/base/stats/events.cc index 771927564..b583e5936 100644 --- a/base/stats/events.cc +++ b/base/stats/events.cc @@ -37,8 +37,9 @@ #include "base/stats/mysql_run.hh" #endif -#include "base/str.hh" +#include "base/match.hh" #include "sim/host.hh" +#include "sim/sim_object.hh" #include "sim/universe.hh" using namespace std; @@ -47,38 +48,7 @@ namespace Stats { Tick EventStart = ULL(0x7fffffffffffffff); -vector event_ignore; -vector > ignore_tokens; -vector ignore_size; -int event_ignore_size; - -bool -ignoreEvent(const string &name) -{ - vector name_tokens; - tokenize(name_tokens, name, '.'); - int ntsize = name_tokens.size(); - - for (int i = 0; i < event_ignore_size; ++i) { - bool match = true; - int jstop = ignore_size[i]; - for (int j = 0; j < jstop; ++j) { - if (j >= ntsize) - break; - - const string &ignore = ignore_tokens[i][j]; - if (ignore != "*" && ignore != name_tokens[j]) { - match = false; - break; - } - } - - if (match == true) - return true; - } - - return false; -} +ObjectMatch event_ignore; #ifdef USE_MYSQL class InsertEvent diff --git a/base/trace.cc b/base/trace.cc index d924b9a4b..bc6c9aa7a 100644 --- a/base/trace.cc +++ b/base/trace.cc @@ -51,39 +51,7 @@ FlagVec flags(NumFlags, false); // ostream *dprintf_stream = &cerr; -int dprintf_ignore_size; -vector dprintf_ignore; -vector > ignore_tokens; -vector ignore_size; - -bool -dprintf_ignore_name(const string &name) -{ - vector name_tokens; - tokenize(name_tokens, name, '.'); - int ntsize = name_tokens.size(); - - for (int i = 0; i < dprintf_ignore_size; ++i) { - bool match = true; - int jstop = ignore_size[i]; - for (int j = 0; j < jstop; ++j) { - if (j >= ntsize) - break; - - const string &ignore = ignore_tokens[i][j]; - if (ignore != "*" && ignore != name_tokens[j]) { - match = false; - break; - } - } - - if (match == true) - return true; - } - - return false; -} - +ObjectMatch ignore; Log theLog; diff --git a/base/trace.hh b/base/trace.hh index b363bec94..1aadb36cf 100644 --- a/base/trace.hh +++ b/base/trace.hh @@ -32,6 +32,7 @@ #include #include "base/cprintf.hh" +#include "base/match.hh" #include "sim/host.hh" #include "sim/universe.hh" @@ -137,16 +138,13 @@ namespace Trace { extern Log theLog; - extern int dprintf_ignore_size; - - bool - dprintf_ignore_name(const std::string &name); + extern ObjectMatch ignore; inline void dprintf(const char *format, cp::ArgList &args, Tick cycle, const std::string &name) { - if (!dprintf_ignore_size || name.empty() || !dprintf_ignore_name(name)) + if (name.empty() || !ignore.match(name)) theLog.append(new Trace::PrintfRecord(format, args, cycle, name)); } diff --git a/sim/sim_object.cc b/sim/sim_object.cc index 39219b500..818648b98 100644 --- a/sim/sim_object.cc +++ b/sim/sim_object.cc @@ -30,6 +30,7 @@ #include "base/callback.hh" #include "base/inifile.hh" +#include "base/match.hh" #include "base/misc.hh" #include "base/trace.hh" #include "base/stats/events.hh" @@ -53,13 +54,21 @@ using namespace std; // SimObject::SimObjectList SimObject::simObjectList; +namespace Stats { + extern ObjectMatch event_ignore; +} + // // SimObject constructor: used to maintain static simObjectList // SimObject::SimObject(const string &_name) : objName(_name) { - doRecordEvent = !Stats::ignoreEvent(_name); +#ifdef DEBUG + doDebugBreak = false; +#endif + + doRecordEvent = !Stats::event_ignore.match(_name); simObjectList.push_back(this); } @@ -172,6 +181,31 @@ SimObject::serializeAll(ostream &os) } } +#ifdef DEBUG +// +// static function: flag which objects should have the debugger break +// +void +SimObject::debugObjectBreak(const string &objs) +{ + SimObjectList::const_iterator i = simObjectList.begin(); + SimObjectList::const_iterator end = simObjectList.end(); + + ObjectMatch match(objs); + for (; i != end; ++i) { + SimObject *obj = *i; + obj->doDebugBreak = match.match(obj->name()); + } +} + +extern "C" +void +debugObjectBreak(const char *objs) +{ + SimObject::debugObjectBreak(string(objs)); +} +#endif + void SimObject::recordEvent(const std::string &stat) { diff --git a/sim/sim_object.hh b/sim/sim_object.hh index 770cd558e..dfd70f8ec 100644 --- a/sim/sim_object.hh +++ b/sim/sim_object.hh @@ -83,6 +83,12 @@ class SimObject : public Serializable // static: call nameOut() & serialize() on all SimObjects static void serializeAll(std::ostream &); +#ifdef DEBUG + public: + bool doDebugBreak; + static void debugObjectBreak(const std::string &objs); +#endif + public: bool doRecordEvent; void recordEvent(const std::string &stat);