X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_model.hpp;h=a2847547421f8972666681d0784882192e2fb628;hb=e0df952b67f3ae38aeb0fd7e32942f8fa53ac49f;hp=80898805d64893103a41f33af0754a9e0cdf0345;hpb=885f265065244d05fd158d71d27b6fbaba5a2212;p=apitrace diff --git a/trace_model.hpp b/trace_model.hpp index 8089880..a284754 100644 --- a/trace_model.hpp +++ b/trace_model.hpp @@ -23,15 +23,17 @@ * **************************************************************************/ +/* + * Object hierarchy for describing the traces in memory. + */ + #ifndef _TRACE_MODEL_HPP_ #define _TRACE_MODEL_HPP_ -#include +#include -#include #include -#include #include #include @@ -39,205 +41,314 @@ namespace Trace { -class Visitor; -class Dumper; -class UInt; +typedef unsigned Id; -class Value -{ -public: - virtual void visit(Visitor &visitor) = 0; +struct FunctionSig { + Id id; + const char *name; + unsigned num_args; + const char **arg_names; +}; - operator signed long long (void) const; - operator unsigned long long (void) const; - operator double (void) const; - operator void * (void) const; - inline operator signed char (void) const { - return static_cast(*this); - } +struct StructSig { + Id id; + const char *name; + unsigned num_members; + const char **member_names; +}; - inline operator unsigned char (void) const { - return static_cast(*this); - } - inline operator signed short (void) const { - return static_cast(*this); - } +struct EnumSig { + Id id; + const char *name; + signed long long value; +}; - inline operator unsigned short (void) const { - return static_cast(*this); - } - inline operator signed (void) const { - return static_cast(*this); - } +struct BitmaskFlag { + const char *name; + unsigned long long value; +}; - inline operator unsigned (void) const { - return static_cast(*this); - } - inline operator signed long (void) const { - return static_cast(*this); - } +struct BitmaskSig { + Id id; + unsigned num_flags; + const BitmaskFlag *flags; +}; - inline operator unsigned long (void) const { - return static_cast(*this); - } - inline operator float (void) const { - return static_cast(*this); - } +class Visitor; - const Value & operator[](size_t index) const; + +class Value +{ +public: + virtual ~Value() {} + virtual void visit(Visitor &visitor) = 0; + + virtual bool toBool(void) const = 0; + 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; + + const Value & operator[](size_t index) const; + + void dump(std::ostream &os, bool color=true); }; -class Void : public Value +class Null : public Value { public: - void visit(Visitor &visitor); + 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 *toPointer(void) const; + void *toPointer(bool bind); + unsigned long long toUIntPtr(void) const; + const char *toString(void) const; + void visit(Visitor &visitor); }; class Bool : public Value { public: - Bool(bool _value) : value(_value) {} + Bool(bool _value) : value(_value) {} - void visit(Visitor &visitor); + 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); - bool value; + bool value; }; class SInt : public Value { public: - SInt(signed long long _value) : value(_value) {} + SInt(signed long long _value) : value(_value) {} - void visit(Visitor &visitor); + 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); - signed long long value; + signed long long value; }; class UInt : public Value { public: - UInt(unsigned long long _value) : value(_value) {} + UInt(unsigned long long _value) : value(_value) {} - void visit(Visitor &visitor); + 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); - unsigned long long value; + unsigned long long value; }; class Float : public Value { public: - Float(double _value) : value(_value) {} + Float(double _value) : value(_value) {} - void visit(Visitor &visitor); + 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); - double value; + double value; }; class String : public Value { public: - String(std::string _value) : value(_value) {} + String(const char * _value) : value(_value) {} - void visit(Visitor &visitor); + bool toBool(void) const; + const char *toString(void) const; + void visit(Visitor &visitor); - std::string value; + const char * value; }; -class Const : public Value +class Enum : public Value { public: - Const(std::string _name, Value *_value) : name(_name), value(_value) {} + Enum(const EnumSig *_sig) : sig(_sig) {} - void visit(Visitor &visitor); + 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); - std::string name; - Value *value; + const EnumSig *sig; }; -class Array : public Value +class Bitmask : public UInt { public: - Array(size_t len) : values(len) {} + Bitmask(const BitmaskSig *_sig, unsigned long long _value) : UInt(_value), sig(_sig) {} - void visit(Visitor &visitor); + void visit(Visitor &visitor); - std::vector values; + const BitmaskSig *sig; }; -class Blob : public Value +class Struct : public Value { public: - Blob(size_t _size) { - size = size; - buf = new char[_size]; - } + Struct(StructSig *_sig) : sig(_sig), members(_sig->num_members) { } + ~Struct(); - ~Blob() { - delete [] buf; - } + bool toBool(void) const; + void visit(Visitor &visitor); - void visit(Visitor &visitor); + const StructSig *sig; + std::vector members; +}; + + +class Array : public Value +{ +public: + Array(size_t len) : values(len) {} + ~Array(); - size_t size; - char *buf; + bool toBool(void) const; + void visit(Visitor &visitor); + + std::vector values; }; -class Visitor +class Blob : public Value { public: - virtual void visit(Void *) {assert(0);} - virtual void visit(Bool *) {assert(0);} - virtual void visit(SInt *) {assert(0);} - virtual void visit(UInt *) {assert(0);} - virtual void visit(Float *) {assert(0);} - virtual void visit(String *) {assert(0);} - virtual void visit(Const *) {assert(0);} - virtual void visit(Array *) {assert(0);} - virtual void visit(Blob *) {assert(0);} + Blob(size_t _size) { + size = _size; + buf = new char[_size]; + bound = false; + } + + ~Blob(); + + bool toBool(void) const; + void *toPointer(void) const; + void *toPointer(bool bind); + void visit(Visitor &visitor); + + size_t size; + char *buf; + bool bound; }; -std::ostream & operator <<(std::ostream &os, Value *value); +class Pointer : public UInt +{ +public: + Pointer(unsigned long long value) : UInt(value) {} + bool toBool(void) const; + void *toPointer(void) const; + void *toPointer(bool bind); + unsigned long long toUIntPtr(void) const; + void visit(Visitor &visitor); +}; + + +class Visitor +{ +public: + virtual void visit(Null *); + virtual void visit(Bool *); + virtual void visit(SInt *); + virtual void visit(UInt *); + virtual void visit(Float *); + virtual void visit(String *); + virtual void visit(Enum *); + virtual void visit(Bitmask *); + virtual void visit(Struct *); + virtual void visit(Array *); + virtual void visit(Blob *); + virtual void visit(Pointer *); + +protected: + inline void _visit(Value *value) { + if (value) { + value->visit(*this); + } + } +}; -signed long long asSInt(const Value &node); -unsigned long long asUInt(const Value &node); -double asFloat(const Value &node); +inline std::ostream & operator <<(std::ostream &os, Value *value) { + if (value) { + value->dump(os); + } + return os; +} -typedef std::pair Arg; class Call { public: - std::string name; - std::list args; - Value *ret; + unsigned no; + const FunctionSig *sig; + std::vector args; + Value *ret; - Call() : ret(0) { } + Call(FunctionSig *_sig) : sig(_sig), args(_sig->num_args), ret(0) { } + ~Call(); - Value & arg(const char *name); -}; + inline const char * name(void) const { + return sig->name; + } + inline Value & arg(unsigned index) { + assert(index < args.size()); + return *(args[index]); + } + + void dump(std::ostream &os, bool color=true); +}; -std::ostream & operator <<(std::ostream &os, Call &call); +inline std::ostream & operator <<(std::ostream &os, Call &call) { + call.dump(os); + return os; +} } /* namespace Trace */