X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Ftrace_model.hpp;h=2ce133903d1ffb3f822d7186d215587ffe7808a3;hb=refs%2Fheads%2Fglx-copy-sub-buffer;hp=531a79a64607a9abc2788176b5c2a6b9fdb3c5d8;hpb=ac55ba8608d9f5cb2407fddcb21257c595d1e801;p=apitrace diff --git a/common/trace_model.hpp b/common/trace_model.hpp index 531a79a..2ce1339 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; } }; @@ -262,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; }; @@ -276,6 +299,9 @@ 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 @@ -349,6 +375,7 @@ public: }; struct RawStackFrame { + Id id; const char * module; const char * function; const char * filename; @@ -362,6 +389,22 @@ struct RawStackFrame { 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 { @@ -369,7 +412,7 @@ public: ~StackFrame(); }; -typedef std::vector Backtrace; +typedef std::vector Backtrace; class Visitor { @@ -472,6 +515,13 @@ enum { * Whether this call is verbose (i.e., not usually interesting). */ CALL_FLAG_VERBOSE = (1 << 7), + + /** + * String markers. + */ + CALL_FLAG_MARKER = (1 << 8), + CALL_FLAG_MARKER_PUSH = (1 << 9), + CALL_FLAG_MARKER_POP = (1 << 10), };