summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/arch/alpha/miscregfile.cc2
-rw-r--r--src/arch/sparc/pagetable.hh2
-rw-r--r--src/arch/x86/emulenv.cc2
-rw-r--r--src/arch/x86/predecoder.hh2
-rw-r--r--src/base/loader/elf_object.cc1
-rw-r--r--src/base/misc.cc79
-rw-r--r--src/base/misc.hh140
-rw-r--r--src/python/m5/util/attrdict.py25
-rw-r--r--src/python/m5/util/jobfile.py52
-rw-r--r--src/python/swig/core.i5
-rw-r--r--src/sim/debug.cc16
-rw-r--r--src/sim/simulate.cc2
12 files changed, 207 insertions, 121 deletions
diff --git a/src/arch/alpha/miscregfile.cc b/src/arch/alpha/miscregfile.cc
index f119ca6bb..61a86f1fb 100644
--- a/src/arch/alpha/miscregfile.cc
+++ b/src/arch/alpha/miscregfile.cc
@@ -30,6 +30,8 @@
* Kevin Lim
*/
+#include <cassert>
+
#include "arch/alpha/miscregfile.hh"
#include "base/misc.hh"
diff --git a/src/arch/sparc/pagetable.hh b/src/arch/sparc/pagetable.hh
index d787f30e4..ee4ca0c2c 100644
--- a/src/arch/sparc/pagetable.hh
+++ b/src/arch/sparc/pagetable.hh
@@ -31,6 +31,8 @@
#ifndef __ARCH_SPARC_PAGETABLE_HH__
#define __ARCH_SPARC_PAGETABLE_HH__
+#include <cassert>
+
#include "arch/sparc/isa_traits.hh"
#include "base/bitfield.hh"
#include "base/misc.hh"
diff --git a/src/arch/x86/emulenv.cc b/src/arch/x86/emulenv.cc
index 142e233db..30ed80942 100644
--- a/src/arch/x86/emulenv.cc
+++ b/src/arch/x86/emulenv.cc
@@ -55,6 +55,8 @@
* Authors: Gabe Black
*/
+#include <cassert>
+
#include "arch/x86/emulenv.hh"
#include "base/misc.hh"
diff --git a/src/arch/x86/predecoder.hh b/src/arch/x86/predecoder.hh
index 6e41e8134..a16ce6fb8 100644
--- a/src/arch/x86/predecoder.hh
+++ b/src/arch/x86/predecoder.hh
@@ -58,6 +58,8 @@
#ifndef __ARCH_X86_PREDECODER_HH__
#define __ARCH_X86_PREDECODER_HH__
+#include <cassert>
+
#include "arch/x86/types.hh"
#include "base/bitfield.hh"
#include "base/misc.hh"
diff --git a/src/base/loader/elf_object.cc b/src/base/loader/elf_object.cc
index ad46a7de5..f71c4456b 100644
--- a/src/base/loader/elf_object.cc
+++ b/src/base/loader/elf_object.cc
@@ -29,6 +29,7 @@
* Ali Saidi
*/
+#include <cassert>
#include <string>
#include "gelf.h"
diff --git a/src/base/misc.cc b/src/base/misc.cc
index 7d284a378..b0c769ac6 100644
--- a/src/base/misc.cc
+++ b/src/base/misc.cc
@@ -43,42 +43,24 @@
using namespace std;
-void
-__panic(const char *func, const char *file, int line, const char *fmt,
- CPRINTF_DEFINITION)
-{
- string format = "panic: ";
- format += fmt;
- switch (format[format.size() - 1]) {
- case '\n':
- case '\r':
- break;
- default:
- format += "\n";
- }
+bool want_warn = true;
+bool want_info = true;
+bool want_hack = true;
- format += " @ cycle %d\n[%s:%s, line %d]\n";
-
- CPrintfArgsList args(VARARGS_ALLARGS);
-
- args.push_back(curTick);
- args.push_back(func);
- args.push_back(file);
- args.push_back(line);
-
- ccprintf(cerr, format.c_str(), args);
-
- abort();
-}
+bool warn_verbose = false;
+bool info_verbose = false;
+bool hack_verbose = false;
void
-__fatal(const char *func, const char *file, int line, const char *fmt,
- CPRINTF_DEFINITION)
+__exit_message(const char *prefix, int code,
+ const char *func, const char *file, int line,
+ const char *fmt, CPRINTF_DEFINITION)
{
CPrintfArgsList args(VARARGS_ALLARGS);
- string format = "fatal: ";
- format += fmt;
+ string format = prefix;
+ format += ": ";
+ format += fmt;
switch (format[format.size() - 1]) {
case '\n':
case '\r':
@@ -98,16 +80,22 @@ __fatal(const char *func, const char *file, int line, const char *fmt,
ccprintf(cerr, format.c_str(), args);
- exit(1);
+ if (code < 0)
+ abort();
+ else
+ exit(code);
}
void
-__warn(const char *func, const char *file, int line, const char *fmt,
- CPRINTF_DEFINITION)
+__base_message(std::ostream &stream, const char *prefix, bool verbose,
+ const char *func, const char *file, int line,
+ const char *fmt, CPRINTF_DEFINITION)
{
- string format = "warn: ";
- format += fmt;
+ CPrintfArgsList args(VARARGS_ALLARGS);
+ string format = prefix;
+ format += ": ";
+ format += fmt;
switch (format[format.size() - 1]) {
case '\n':
case '\r':
@@ -116,18 +104,13 @@ __warn(const char *func, const char *file, int line, const char *fmt,
format += "\n";
}
-#ifdef VERBOSE_WARN
- format += " @ cycle %d\n[%s:%s, line %d]\n";
-#endif
-
- CPrintfArgsList args(VARARGS_ALLARGS);
-
-#ifdef VERBOSE_WARN
- args.push_back(curTick);
- args.push_back(func);
- args.push_back(file);
- args.push_back(line);
-#endif
+ if (verbose) {
+ format += " @ cycle %d\n[%s:%s, line %d]\n";
+ args.push_back(curTick);
+ args.push_back(func);
+ args.push_back(file);
+ args.push_back(line);
+ }
- ccprintf(cerr, format.c_str(), args);
+ ccprintf(stream, format.c_str(), args);
}
diff --git a/src/base/misc.hh b/src/base/misc.hh
index 6b0025c34..5bb4e0e77 100644
--- a/src/base/misc.hh
+++ b/src/base/misc.hh
@@ -29,10 +29,8 @@
* Dave Greene
*/
-#ifndef __MISC_HH__
-#define __MISC_HH__
-
-#include <cassert>
+#ifndef __BASE_MISC_HH__
+#define __BASE_MISC_HH__
#include "base/compiler.hh"
#include "base/cprintf.hh"
@@ -42,6 +40,30 @@
#define __FUNCTION__ "how to fix me?"
#endif
+// General exit message, these functions will never return and will
+// either abort() if code is < 0 or exit with the code if >= 0
+void __exit_message(const char *prefix, int code,
+ const char *func, const char *file, int line,
+ const char *format, CPRINTF_DECLARATION) M5_ATTR_NORETURN;
+
+void __exit_message(const char *prefix, int code,
+ const char *func, const char *file, int line,
+ const std::string &format, CPRINTF_DECLARATION) M5_ATTR_NORETURN;
+
+inline void
+__exit_message(const char *prefix, int code,
+ const char *func, const char *file, int line,
+ const std::string& format, CPRINTF_DEFINITION)
+{
+ __exit_message(prefix, code, func, file, line, format.c_str(),
+ VARARGS_ALLARGS);
+}
+
+M5_PRAGMA_NORETURN(__exit_message)
+#define exit_message(prefix, code, ...) \
+ __exit_message(prefix, code, __FUNCTION__, __FILE__, __LINE__, \
+ __VA_ARGS__)
+
//
// This implements a cprintf based panic() function. panic() should
// be called when something happens that should never ever happen
@@ -49,20 +71,7 @@
// calls abort which can dump core or enter the debugger.
//
//
-void __panic(const char *func, const char *file, int line, const char *format,
- CPRINTF_DECLARATION) M5_ATTR_NORETURN;
-void __panic(const char *func, const char *file, int line,
- const std::string &format, CPRINTF_DECLARATION)
-M5_ATTR_NORETURN;
-
-inline void
-__panic(const char *func, const char *file, int line,
- const std::string &format, CPRINTF_DEFINITION)
-{
- __panic(func, file, line, format.c_str(), VARARGS_ALLARGS);
-}
-M5_PRAGMA_NORETURN(__panic)
-#define panic(...) __panic(__FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
+#define panic(...) exit_message("panic", -1, __VA_ARGS__)
//
// This implements a cprintf based fatal() function. fatal() should
@@ -72,45 +81,70 @@ M5_PRAGMA_NORETURN(__panic)
// "normal" exit with an error code, as opposed to abort() like
// panic() does.
//
-void __fatal(const char *func, const char *file, int line, const char *format,
- CPRINTF_DECLARATION) M5_ATTR_NORETURN;
-void __fatal(const char *func, const char *file, int line,
- const std::string &format, CPRINTF_DECLARATION)
- M5_ATTR_NORETURN;
+#define fatal(...) exit_message("fatal", 1, __VA_ARGS__)
-inline void
-__fatal(const char *func, const char *file, int line,
- const std::string &format, CPRINTF_DEFINITION)
-{
- __fatal(func, file, line, format.c_str(), VARARGS_ALLARGS);
-}
-M5_PRAGMA_NORETURN(__fatal)
-#define fatal(...) __fatal(__FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
+void
+__base_message(std::ostream &stream, const char *prefix, bool verbose,
+ const char *func, const char *file, int line,
+ const char *format, CPRINTF_DECLARATION);
-//
-// This implements a cprintf based warn
-//
-void __warn(const char *func, const char *file, int line, const char *format,
- CPRINTF_DECLARATION);
inline void
-__warn(const char *func, const char *file, int line, const std::string &format,
- CPRINTF_DECLARATION)
+__base_message(std::ostream &stream, const char *prefix, bool verbose,
+ const char *func, const char *file, int line,
+ const std::string &format, CPRINTF_DECLARATION)
{
- __warn(func, file, line, format, VARARGS_ALLARGS);
+ __base_message(stream, prefix, verbose, func, file, line, format.c_str(),
+ VARARGS_ALLARGS);
}
-#define warn(...) __warn(__FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
-
-// Only print the warning message the first time it is seen. This
-// doesn't check the warning string itself, it just only lets one
-// warning come from the statement. So, even if the arguments change
-// and that would have resulted in a different warning message,
-// subsequent messages would still be supressed.
-#define warn_once(...) do { \
- static bool once = false; \
- if (!once) { \
- warn(__VA_ARGS__); \
- once = true; \
- } \
+
+#define base_message(stream, prefix, verbose, ...) \
+ __base_message(stream, prefix, verbose, __FUNCTION__, __FILE__, __LINE__, \
+ __VA_ARGS__)
+
+// Only print the message the first time this expression is
+// encountered. i.e. This doesn't check the string itself and
+// prevent duplicate strings, this prevents the statement from
+// happening more than once. So, even if the arguments change and that
+// would have resulted in a different message thoes messages would be
+// supressed.
+#define base_message_once(...) do { \
+ static bool once = false; \
+ if (!once) { \
+ base_message(__VA_ARGS__); \
+ once = true; \
+ } \
+ } while (0)
+
+#define cond_message(cond, ...) do { \
+ if (cond) \
+ base_message(__VA_ARGS__); \
} while (0)
-#endif // __MISC_HH__
+#define cond_message_once(cond, ...) do { \
+ static bool once = false; \
+ if (!once && cond) { \
+ base_message(__VA_ARGS__); \
+ once = true; \
+ } \
+ } while (0)
+
+
+extern bool want_warn, warn_verbose;
+extern bool want_info, info_verbose;
+extern bool want_hack, hack_verbose;
+
+#define warn(...) \
+ cond_message(want_warn, std::cerr, "warn", warn_verbose, __VA_ARGS__)
+#define info(...) \
+ cond_message(want_info, std::cout, "info", info_verbose, __VA_ARGS__)
+#define hack(...) \
+ cond_message(want_hack, std::cerr, "hack", hack_verbose, __VA_ARGS__)
+
+#define warn_once(...) \
+ cond_message_once(want_warn, std::cerr, "warn", warn_verbose, __VA_ARGS__)
+#define info_once(...) \
+ cond_message_once(want_info, std::cout, "info", info_verbose, __VA_ARGS__)
+#define hack_once(...) \
+ cond_message_once(want_hack, std::cerr, "hack", hack_verbose, __VA_ARGS__)
+
+#endif // __BASE_MISC_HH__
diff --git a/src/python/m5/util/attrdict.py b/src/python/m5/util/attrdict.py
index 44479c456..56f67217b 100644
--- a/src/python/m5/util/attrdict.py
+++ b/src/python/m5/util/attrdict.py
@@ -26,16 +26,17 @@
#
# Authors: Nathan Binkert
-__all__ = [ 'attrdict', 'optiondict' ]
+__all__ = [ 'attrdict', 'multiattrdict', 'optiondict' ]
class attrdict(dict):
+ """Wrap dict, so you can use attribute access to get/set elements"""
def __getattr__(self, attr):
if attr in self:
return self.__getitem__(attr)
return super(attrdict, self).__getattribute__(attr)
def __setattr__(self, attr, value):
- if attr in dir(self):
+ if attr in dir(self) or attr.startswith('_'):
return super(attrdict, self).__setattr__(attr, value)
return self.__setitem__(attr, value)
@@ -44,13 +45,23 @@ class attrdict(dict):
return self.__delitem__(attr)
return super(attrdict, self).__delattr__(attr, value)
+class multiattrdict(attrdict):
+ """Wrap attrdict so that nested attribute accesses automatically create
+ nested dictionaries."""
+ def __getattr__(self, attr):
+ try:
+ return super(multiattrdict, self).__getattr__(attr)
+ except AttributeError:
+ d = optiondict()
+ setattr(self, attr, d)
+ return d
+
class optiondict(attrdict):
+ """Modify attrdict so that a missing attribute just returns None"""
def __getattr__(self, attr):
try:
return super(optiondict, self).__getattr__(attr)
except AttributeError:
- #d = optionsdict()
- #setattr(self, attr, d)
return None
if __name__ == '__main__':
@@ -68,3 +79,9 @@ if __name__ == '__main__':
del x.z
print dir(x)
print(x)
+
+ x = multiattrdict()
+ x.y.z = 9
+ print x
+ print x.y
+ print x.y.z
diff --git a/src/python/m5/util/jobfile.py b/src/python/m5/util/jobfile.py
index 5e015c4ad..c830895f6 100644
--- a/src/python/m5/util/jobfile.py
+++ b/src/python/m5/util/jobfile.py
@@ -28,8 +28,8 @@
import sys
-from attrdict import attrdict, optiondict
-from misc import crossproduct, flatten
+from attrdict import optiondict
+from misc import crossproduct
class Data(object):
def __init__(self, name, desc, **kwargs):
@@ -41,9 +41,29 @@ class Data(object):
if not isinstance(obj, Data):
raise AttributeError, "can only update from Data object"
- for k,v in obj.__dict__.iteritems():
- if not k.startswith('_'):
- self.__dict__[k] = v
+ for key,val in obj.__dict__.iteritems():
+ if key.startswith('_') or key in ('name', 'desc'):
+ continue
+
+ if key not in self.__dict__:
+ self.__dict__[key] = val
+ continue
+
+ if not isinstance(val, dict):
+ if self.__dict__[key] == val:
+ continue
+
+ raise AttributeError, \
+ "%s specified more than once old: %s new: %s" % \
+ (key, self.__dict__[key], val)
+
+ d = self.__dict__[key]
+ for k,v in val.iteritems():
+ if k in d:
+ raise AttributeError, \
+ "%s specified more than once in %s" % (k, key)
+ d[k] = v
+
if hasattr(self, 'system') and hasattr(obj, 'system'):
if self.system != obj.system:
raise AttributeError, \
@@ -93,6 +113,14 @@ class Data(object):
result[key] = self[key]
return result
+ def __repr__(self):
+ d = {}
+ for key,value in self.__dict__.iteritems():
+ if not key.startswith('_'):
+ d[key] = value
+
+ return "<%s: %s>" % (type(self).__name__, d)
+
def __str__(self):
return self.name
@@ -391,18 +419,12 @@ def JobFile(jobfile):
execfile(filename, data)
if 'conf' not in data:
raise ImportError, 'cannot import name conf from %s' % jobfile
- conf = data['conf']
- import jobfile
- if not isinstance(conf, Configuration):
- raise AttributeError, \
- 'conf in jobfile: %s (%s) is not type %s' % \
- (jobfile, type(conf), Configuration)
- return conf
+ return data['conf']
def main(conf=None):
- import sys
-
- usage = 'Usage: %s [-b] [-c] [-v] <jobfile>' % sys.argv[0]
+ usage = 'Usage: %s [-b] [-c] [-v]' % sys.argv[0]
+ if conf is None:
+ usage += ' <jobfile>'
try:
import getopt
diff --git a/src/python/swig/core.i b/src/python/swig/core.i
index b0773ca68..566998639 100644
--- a/src/python/swig/core.i
+++ b/src/python/swig/core.i
@@ -34,6 +34,7 @@
%{
#include "python/swig/pyobject.hh"
+#include "base/misc.hh"
#include "base/socket.hh"
#include "sim/core.hh"
#include "sim/host.hh"
@@ -76,6 +77,10 @@ void unserializeAll(const std::string &cpt_dir);
void initAll();
void regAllStats();
+bool want_warn, warn_verbose;
+bool want_info, info_verbose;
+bool want_hack, hack_verbose;
+
%wrapper %{
// fix up module name to reflect the fact that it's inside the m5 package
#undef SWIG_name
diff --git a/src/sim/debug.cc b/src/sim/debug.cc
index 3684f6767..57ca0458c 100644
--- a/src/sim/debug.cc
+++ b/src/sim/debug.cc
@@ -29,6 +29,7 @@
* Steve Reinhardt
*/
+#include <Python.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
@@ -106,6 +107,21 @@ eventqDump()
warn("need to dump all queues");
}
+void
+py_interact()
+{
+ PyObject *globals;
+ PyObject *locals;
+
+ globals = PyEval_GetGlobals();
+ Py_INCREF(globals);
+ locals = PyDict_New();
+ PyRun_String("import code", Py_file_input, globals, locals);
+ PyRun_String("code.interact(local=globals())", Py_file_input,
+ globals, locals);
+ Py_DECREF(globals);
+ Py_DECREF(locals);
+}
int remote_gdb_base_port = 7000;
diff --git a/src/sim/simulate.cc b/src/sim/simulate.cc
index 59d79b7c6..7f40805e6 100644
--- a/src/sim/simulate.cc
+++ b/src/sim/simulate.cc
@@ -47,7 +47,7 @@
SimLoopExitEvent *
simulate(Tick num_cycles)
{
- warn("Entering event queue @ %d. Starting simulation...\n", curTick);
+ info("Entering event queue @ %d. Starting simulation...\n", curTick);
if (num_cycles < 0)
fatal("simulate: num_cycles must be >= 0 (was %d)\n", num_cycles);