X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace.hpp;h=dc11bb382243b13c51afe837c7fec40f6664a7de;hb=97ac28e65ca20b5649552597afaeee1d67766f6a;hp=05cef5970ed88cad50efb8a7bb8d338076efbc0d;hpb=f237aad2923b7d402b7fd2a0a71aa1a030ddeebb;p=apitrace diff --git a/retrace.hpp b/retrace.hpp index 05cef59..dc11bb3 100644 --- a/retrace.hpp +++ b/retrace.hpp @@ -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 @@ -26,7 +26,11 @@ #ifndef _RETRACE_HPP_ #define _RETRACE_HPP_ +#include + +#include #include +#include #include "trace_model.hpp" @@ -76,13 +80,118 @@ public: }; +/** + * 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(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(alloc(sizeof(T) * n)); + } + + inline + ~ScopedAllocator() { + while (next) { + void *temp = *static_cast(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); + + +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 Map; + Map map; + + std::vector callbacks; -void retrace_call(Trace::Call &call); +public: + Retracer() { + addCallbacks(stdc_callbacks); + } + + virtual ~Retracer() {} + + void addCallback(const Entry *entry); + void addCallbacks(const Entry *entries); + + void retrace(trace::Call &call); +}; } /* namespace retrace */