X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Ftrace_model.hpp;h=d04fe5eb4086ae3d4166426d6d030cc678a1e166;hb=685c51509eb0d04fbd382bfb6ebc294a06376645;hp=f208032d371eeb1e38d4704c07dc342203b88931;hpb=d31700077ae75f450b12ad7d9276c08cbad57d1b;p=apitrace diff --git a/common/trace_model.hpp b/common/trace_model.hpp index f208032..d04fe5e 100644 --- a/common/trace_model.hpp +++ b/common/trace_model.hpp @@ -32,10 +32,10 @@ #include +#include #include #include -#include namespace trace { @@ -60,13 +60,19 @@ struct StructSig { }; -struct EnumSig { - Id id; +struct EnumValue { const char *name; signed long long value; }; +struct EnumSig { + Id id; + unsigned num_values; + const EnumValue *values; +}; + + struct BitmaskFlag { const char *name; unsigned long long value; @@ -101,8 +107,6 @@ public: virtual const char *toString(void) const; const Value & operator[](size_t index) const; - - void dump(std::ostream &os, bool color=true); }; @@ -216,19 +220,25 @@ public: }; -class Enum : public Value +class Enum : public SInt { public: - Enum(const EnumSig *_sig) : sig(_sig) {} + Enum(const EnumSig *_sig, signed long long _value) : SInt(_value), sig(_sig) {} - bool toBool(void) const; - signed long long toSInt(void) const; - unsigned long long toUInt(void) const; - virtual float toFloat(void) const; - virtual double toDouble(void) const; void visit(Visitor &visitor); const EnumSig *sig; + + const EnumValue * + lookup() { + // TODO: use a std::map + for (const EnumValue *it = sig->values; it != sig->values + sig->num_values; ++it) { + if (it->value == value) { + return it; + } + } + return NULL; + } }; @@ -267,6 +277,11 @@ public: void visit(Visitor &visitor); std::vector values; + + inline size_t + size(void) const { + return values.size(); + } }; @@ -305,6 +320,58 @@ public: }; +class Repr : public Value +{ +public: + Repr(Value *human, Value *machine) : + humanValue(human), + machineValue(machine) + {} + + /** Human-readible value */ + Value *humanValue; + + /** Machine-readible value */ + Value *machineValue; + + virtual bool toBool(void) const; + virtual signed long long toSInt(void) const; + virtual unsigned long long toUInt(void) const; + virtual float toFloat(void) const; + virtual double toDouble(void) const; + + virtual void *toPointer(void) const; + virtual void *toPointer(bool bind); + virtual unsigned long long toUIntPtr(void) const; + virtual const char *toString(void) const; + + void visit(Visitor &visitor); +}; + +struct RawStackFrame { + Id id; + const char * module; + const char * function; + const char * filename; + int linenumber; + long long offset; + RawStackFrame() : + module(0), + function(0), + filename(0), + linenumber(-1), + offset(-1) + { + } +}; + +class StackFrame : public RawStackFrame { +public: + ~StackFrame(); +}; + +typedef std::vector Backtrace; + class Visitor { public: @@ -321,7 +388,9 @@ public: virtual void visit(Array *); virtual void visit(Blob *); virtual void visit(Pointer *); - + virtual void visit(Repr *); + virtual void visit(Backtrace *); + virtual void visit(StackFrame *); protected: inline void _visit(Value *value) { if (value) { @@ -331,14 +400,6 @@ protected: }; -inline std::ostream & operator <<(std::ostream &os, Value *value) { - if (value) { - value->dump(os); - } - return os; -} - - typedef unsigned CallFlags; /** @@ -415,22 +476,31 @@ enum { }; +struct Arg +{ + Value *value; +}; + class Call { public: + unsigned thread_id; unsigned no; const FunctionSig *sig; - std::vector args; + std::vector args; Value *ret; CallFlags flags; + Backtrace* backtrace; - Call(FunctionSig *_sig, const CallFlags &_flags) : + Call(const FunctionSig *_sig, const CallFlags &_flags, unsigned _thread_id) : + thread_id(_thread_id), sig(_sig), args(_sig->num_args), ret(0), - flags(_flags) { + flags(_flags), + backtrace(0) { } ~Call(); @@ -441,19 +511,11 @@ public: inline Value & arg(unsigned index) { assert(index < args.size()); - return *(args[index]); + return *(args[index].value); } - - void dump(std::ostream &os, bool color=true); }; -inline std::ostream & operator <<(std::ostream &os, Call &call) { - call.dump(os); - return os; -} - - } /* namespace trace */ #endif /* _TRACE_MODEL_HPP_ */