]> git.cworth.org Git - apitrace/blobdiff - retrace.hpp
Move tracers to wrappers subdirectory.
[apitrace] / retrace.hpp
index d66c64de3679da827d148a45862ea017c87fe420..c1e556a97fbb03d726be09de3cb92540de88e5fc 100644 (file)
@@ -1,6 +1,6 @@
 /**************************************************************************
  *
- * 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 <assert.h>
 #include <string.h>
+#include <stdint.h>
 
 #include <list>
 #include <map>
 #include <ostream>
 
 #include "trace_model.hpp"
+#include "trace_parser.hpp"
 
 
 namespace retrace {
 
 
+extern trace::Parser parser;
+
+
 /**
  * Handle map.
  *
@@ -80,6 +86,90 @@ public:
 };
 
 
+/**
+ * Similar to alloca(), but implemented with malloc.
+ */
+class ScopedAllocator
+{
+private:
+    uintptr_t next;
+
+public:
+    ScopedAllocator() :
+        next(0) {
+    }
+
+    inline void *
+    alloc(size_t size) {
+        if (!size) {
+            return NULL;
+        }
+
+        uintptr_t * buf = static_cast<uintptr_t *>(malloc(sizeof(uintptr_t) + size));
+        if (!buf) {
+            return NULL;
+        }
+
+        *buf = next;
+        next = reinterpret_cast<uintptr_t>(buf);
+        assert((next & 1) == 0);
+
+        return static_cast<void *>(&buf[1]);
+    }
+
+    template< class T >
+    inline T *
+    alloc(size_t n = 1) {
+        return static_cast<T *>(alloc(sizeof(T) * n));
+    }
+
+    /**
+     * Allocate an array with the same dimensions as the specified value.
+     */
+    template< class T >
+    inline T *
+    alloc(const trace::Value *value) {
+        const trace::Array *array = dynamic_cast<const trace::Array *>(value);
+        if (array) {
+            return alloc<T>(array->size());
+        }
+        const trace::Null *null = dynamic_cast<const trace::Null *>(value);
+        if (null) {
+            return NULL;
+        }
+        assert(0);
+        return NULL;
+    }
+
+    /**
+     * Prevent this pointer from being automatically freed.
+     */
+    template< class T >
+    inline void
+    bind(T *ptr) {
+        if (ptr) {
+            reinterpret_cast<uintptr_t *>(ptr)[-1] |= 1;
+        }
+    }
+
+    inline
+    ~ScopedAllocator() {
+        while (next) {
+            uintptr_t temp = *reinterpret_cast<uintptr_t *>(next);
+
+            bool bind = temp & 1;
+            temp &= ~1;
+
+            if (!bind) {
+                free(reinterpret_cast<void *>(next));
+            }
+
+            next = temp;
+        }
+    }
+};
+
+
 void
 addRegion(unsigned long long address, void *buffer, unsigned long long size);
 
@@ -87,7 +177,7 @@ void
 delRegionByPointer(void *ptr);
 
 void *
-toPointer(Trace::Value &value, bool bind = false);
+toPointer(trace::Value &value, bool bind = false);
 
 
 /**
@@ -95,15 +185,20 @@ toPointer(Trace::Value &value, bool bind = false);
  */
 extern int verbosity;
 
+/**
+ * Add profiling data to the dump when retracing.
+ */
+extern bool profiling;
+
 
-std::ostream &warning(Trace::Call &call);
+std::ostream &warning(trace::Call &call);
 
 
-void ignore(Trace::Call &call);
-void unsupported(Trace::Call &call);
+void ignore(trace::Call &call);
+void unsupported(trace::Call &call);
 
 
-typedef void (*Callback)(Trace::Call &call);
+typedef void (*Callback)(trace::Call &call);
 
 struct Entry {
     const char *name;
@@ -138,7 +233,7 @@ public:
     void addCallback(const Entry *entry);
     void addCallbacks(const Entry *entries);
 
-    void retrace(Trace::Call &call);
+    void retrace(trace::Call &call);
 };