summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--digital/ucoolib/ucoolib/utils/dtrace.py37
-rw-r--r--digital/ucoolib/ucoolib/utils/trace.hh133
2 files changed, 170 insertions, 0 deletions
diff --git a/digital/ucoolib/ucoolib/utils/dtrace.py b/digital/ucoolib/ucoolib/utils/dtrace.py
new file mode 100644
index 00000000..f836a363
--- /dev/null
+++ b/digital/ucoolib/ucoolib/utils/dtrace.py
@@ -0,0 +1,37 @@
+"""GDB plugin to dump trace from a Trace object."""
+
+class DTrace(gdb.Command):
+ def __init__(self):
+ gdb.Command.__init__(self, "dtrace", gdb.COMMAND_DATA, gdb.COMPLETE_SYMBOL, True)
+
+ def invoke(self, arg, from_tty):
+ args = gdb.string_to_argv(arg)
+ if len(args) != 1:
+ print 'Usage: dtrace <object>'
+ return
+
+ trace = gdb.parse_and_eval(args[0])
+ args_nb = trace['args_nb'];
+ entries_nb = trace['entries_nb'];
+ index = trace['index'];
+ entries = trace['entries'];
+
+ if entries[index]['str']:
+ r = range(index, entries_nb) + range(index)
+ else:
+ r = range(index)
+
+ for i in r:
+ entry = entries[i]
+ if not entry['str']:
+ break
+ s = entry['str'].string()
+ sargs = s.count('%') - 2 * s.count('%%')
+ args = tuple(entry['args'][i] for i in xrange(sargs))
+ try:
+ s = s % args
+ except:
+ pass
+ print s
+
+DTrace()
diff --git a/digital/ucoolib/ucoolib/utils/trace.hh b/digital/ucoolib/ucoolib/utils/trace.hh
new file mode 100644
index 00000000..df8d59bb
--- /dev/null
+++ b/digital/ucoolib/ucoolib/utils/trace.hh
@@ -0,0 +1,133 @@
+#ifndef ucoolib_utils_trace_hh
+#define ucoolib_utils_trace_hh
+// ucoolib - Microcontroller object oriented library. {{{
+//
+// Copyright (C) 2013 Nicolas Schodet
+//
+// APBTeam:
+// Web: http://apbteam.org/
+// Email: team AT apbteam DOT org
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+//
+// }}}
+
+namespace ucoo {
+
+/// Trace buffer to be read with debugger, no initialisation, should be
+/// instantiated in BSS.
+class TraceBuffer
+{
+ /// Maximum number of arguments.
+ static const int args_nb = 4;
+ /// Maximum number of trace entries.
+ static const int entries_nb = 32;
+ public:
+ /// Trace without argument.
+ inline void operator() (const char *str);
+ /// Trace with N arguments...
+ inline void operator() (const char *str, int a0);
+ inline void operator() (const char *str, int a0, int a1);
+ inline void operator() (const char *str, int a0, int a1, int a2);
+ inline void operator() (const char *str, int a0, int a1, int a2, int a3);
+ private:
+ /// Trace entry, contains all given parameters.
+ struct Entry
+ {
+ const char *str;
+ int args[args_nb];
+ };
+ /// Trace entries array.
+ Entry entries[entries_nb];
+ /// Index of next entry to be written in entries array.
+ unsigned int index;
+};
+
+/// Dummy trace, trace nothing.
+class TraceDummy
+{
+ public:
+ inline void operator() (const char *str) { }
+ inline void operator() (const char *str, int a0) { }
+ inline void operator() (const char *str, int a0, int a1) { }
+ inline void operator() (const char *str, int a0, int a1, int a2) { }
+ inline void operator() (const char *str, int a0, int a1, int a2, int a3) { }
+};
+
+/// Conditional trace, whether it trace or not depends on the template
+/// argument.
+template<bool ENABLED>
+class Trace
+{
+};
+
+template<>
+class Trace<true> : public TraceBuffer
+{
+};
+
+template<>
+class Trace<false> : public TraceDummy
+{
+};
+
+inline void
+TraceBuffer::operator() (const char *str)
+{
+ entries[index].str = str;
+ index = (index + 1) % entries_nb;
+}
+
+inline void
+TraceBuffer::operator() (const char *str, int a0)
+{
+ entries[index].str = str;
+ entries[index].args[0] = a0;
+ index = (index + 1) % entries_nb;
+}
+
+inline void
+TraceBuffer::operator() (const char *str, int a0, int a1)
+{
+ entries[index].str = str;
+ entries[index].args[0] = a0;
+ entries[index].args[1] = a1;
+ index = (index + 1) % entries_nb;
+}
+
+inline void
+TraceBuffer::operator() (const char *str, int a0, int a1, int a2)
+{
+ entries[index].str = str;
+ entries[index].args[0] = a0;
+ entries[index].args[1] = a1;
+ entries[index].args[2] = a2;
+ index = (index + 1) % entries_nb;
+}
+
+inline void
+TraceBuffer::operator() (const char *str, int a0, int a1, int a2, int a3)
+{
+ entries[index].str = str;
+ entries[index].args[0] = a0;
+ entries[index].args[1] = a1;
+ entries[index].args[2] = a2;
+ entries[index].args[3] = a3;
+ index = (index + 1) % entries_nb;
+}
+
+} // namespace ucoo
+
+#endif // ucoolib_utils_trace_hh