X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Ftrace_model.hpp;h=ba7c845362e55fdc5aae14fe42a4597fada84e49;hb=2a5696befce6be00fa655b751af5ce2924ea45ae;hp=076ff098d61f9fa25edf72a80aef7c4796663d9f;hpb=a9d7f8edfea904f8dc84f2ad472cd542437935f7;p=apitrace diff --git a/common/trace_model.hpp b/common/trace_model.hpp index 076ff09..ba7c845 100644 --- a/common/trace_model.hpp +++ b/common/trace_model.hpp @@ -36,11 +36,16 @@ #include #include +#include namespace trace { +// Should match Call::no +typedef unsigned CallNo; + + typedef unsigned Id; @@ -87,6 +92,9 @@ struct BitmaskSig { class Visitor; +class Null; +class Struct; +class Array; class Value @@ -106,6 +114,15 @@ public: virtual unsigned long long toUIntPtr(void) const; virtual const char *toString(void) const; + virtual const Null *toNull(void) const { return NULL; } + virtual Null *toNull(void) { return NULL; } + + virtual const Array *toArray(void) const { return NULL; } + virtual Array *toArray(void) { return NULL; } + + virtual const Struct *toStruct(void) const { return NULL; } + virtual Struct *toStruct(void) { return NULL; } + const Value & operator[](size_t index) const; }; @@ -123,6 +140,9 @@ public: unsigned long long toUIntPtr(void) const; const char *toString(void) const; void visit(Visitor &visitor); + + const Null *toNull(void) const { return this; } + Null *toNull(void) { return this; } }; @@ -228,6 +248,17 @@ public: 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; + } }; @@ -251,6 +282,9 @@ public: bool toBool(void) const; void visit(Visitor &visitor); + const Struct *toStruct(void) const { return this; } + Struct *toStruct(void) { return this; } + const StructSig *sig; std::vector members; }; @@ -265,7 +299,15 @@ public: bool toBool(void) const; void visit(Visitor &visitor); + const Array *toArray(void) const { return this; } + Array *toArray(void) { return this; } + std::vector values; + + inline size_t + size(void) const { + return values.size(); + } }; @@ -304,6 +346,74 @@ 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) + { + } + + void dump(std::ostream &os) { + os << (this->module ? this->module : "?"); + if (this->function != NULL) { + os << ": " << this->function; + } + if (this->offset >= 0) { + os << "+0x" << std::hex << this->offset << std::dec; + } + if (this->filename != NULL) { + os << ": " << this->filename; + if (this->linenumber >= 0) { + os << ":" << this->linenumber; + } + } + } +}; + +class StackFrame : public RawStackFrame { +public: + ~StackFrame(); +}; + +typedef std::vector Backtrace; + class Visitor { public: @@ -320,7 +430,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) { @@ -406,6 +518,11 @@ enum { }; +struct Arg +{ + Value *value; +}; + class Call { @@ -413,17 +530,19 @@ 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, unsigned _thread_id) : + 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(); @@ -434,7 +553,7 @@ public: inline Value & arg(unsigned index) { assert(index < args.size()); - return *(args[index]); + return *(args[index].value); } };