/**************************************************************************
*
- * Copyright 2011 Jose Fonseca
+ * Copyright 2011-2012 Jose Fonseca
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
#ifndef _RETRACE_HPP_
#define _RETRACE_HPP_
+#include <string.h>
+
+#include <list>
#include <map>
+#include <ostream>
#include "trace_model.hpp"
};
+/**
+ * Similar to alloca(), but implemented with malloc.
+ */
+class ScopedAllocator
+{
+private:
+ void *next;
+
+public:
+ ScopedAllocator() :
+ next(NULL) {
+ }
+
+ inline void *
+ alloc(size_t size) {
+ if (!size) {
+ return NULL;
+ }
+
+ void * * buf = static_cast<void **>(malloc(sizeof(void *) + size));
+ if (!buf) {
+ return NULL;
+ }
+
+ *buf = next;
+ next = buf;
+
+ return &buf[1];
+ }
+
+ template< class T >
+ inline T *
+ alloc(size_t n = 1) {
+ return static_cast<T *>(alloc(sizeof(T) * n));
+ }
+
+ inline
+ ~ScopedAllocator() {
+ while (next) {
+ void *temp = *static_cast<void **>(next);
+ free(next);
+ next = temp;
+ }
+ }
+};
+
+
+void
+addRegion(unsigned long long address, void *buffer, unsigned long long size);
+
+void
+delRegionByPointer(void *ptr);
+
+void *
+toPointer(trace::Value &value, bool bind = false);
+
+
/**
* Output verbosity when retracing files.
*/
extern int verbosity;
+/**
+ * Add profiling data to the dump when retracing.
+ */
+extern bool profiling;
+
+
+std::ostream &warning(trace::Call &call);
+
+
+void ignore(trace::Call &call);
+void unsupported(trace::Call &call);
-void retrace_call(Trace::Call &call);
-void retrace_unknown(Trace::Call &call);
+typedef void (*Callback)(trace::Call &call);
+
+struct Entry {
+ const char *name;
+ Callback callback;
+};
+
+
+struct stringComparer {
+ bool operator() (const char *a, const char *b) const {
+ return strcmp(a, b) < 0;
+ }
+};
+
+
+extern const Entry stdc_callbacks[];
+
+
+class Retracer
+{
+ typedef std::map<const char *, Callback, stringComparer> Map;
+ Map map;
+
+ std::vector<Callback> callbacks;
+
+public:
+ Retracer() {
+ addCallbacks(stdc_callbacks);
+ }
+
+ virtual ~Retracer() {}
+
+ void addCallback(const Entry *entry);
+ void addCallbacks(const Entry *entries);
+
+ void retrace(trace::Call &call);
+};
} /* namespace retrace */