From: José Fonseca Date: Fri, 26 Nov 2010 15:01:29 +0000 (+0000) Subject: More efficient call representation. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=2250a0e42a0fcad757f38121859ce7de10384df3;p=apitrace More efficient call representation. --- diff --git a/glretrace.py b/glretrace.py index 549a14e..29ba78f 100644 --- a/glretrace.py +++ b/glretrace.py @@ -101,13 +101,13 @@ static void display(void) { Trace::Call *call; while ((call = parser.parse_call())) { - if (call->name == "glFlush") { + if (call->name() == "glFlush") { glFlush(); return; } - if (call->name == "glXSwapBuffers" || - call->name == "wglSwapBuffers") { + if (call->name() == "glXSwapBuffers" || + call->name() == "wglSwapBuffers") { if (double_buffer) glutSwapBuffers(); else @@ -117,11 +117,11 @@ static void display(void) { retrace_call(*call); - if (call->name == "glBegin") { + if (call->name() == "glBegin") { insideGlBeginEnd = true; } - if (call->name == "glEnd") { + if (call->name() == "glEnd") { insideGlBeginEnd = false; } diff --git a/retrace.py b/retrace.py index 0c14855..53cc6a0 100644 --- a/retrace.py +++ b/retrace.py @@ -222,7 +222,7 @@ class Retracer: print 'static bool retrace_call(Trace::Call &call) {' for function in functions: if not function.sideeffects: - print ' if (call.name == "%s") {' % function.name + print ' if (call.name() == "%s") {' % function.name print ' return true;' print ' }' print @@ -233,11 +233,11 @@ class Retracer: print for function in functions: if function.sideeffects: - print ' if (call.name == "%s") {' % function.name + print ' if (call.name() == "%s") {' % function.name print ' retrace_%s(call);' % function.name print ' return true;' print ' }' - print ' std::cerr << "warning: unknown call " << call.name << "\\n";' + print ' std::cerr << "warning: unknown call " << call.name() << "\\n";' print ' return false;' print '}' print @@ -286,20 +286,20 @@ static void display(void) { Trace::Call *call; while ((call = parser.parse_call())) { - if (call->name == "glFlush" || - call->name == "glXSwapBuffers" || - call->name == "wglSwapBuffers") { + if (call->name() == "glFlush" || + call->name() == "glXSwapBuffers" || + call->name() == "wglSwapBuffers") { glFlush(); return; } retrace_call(*call); - if (call->name == "glBegin") { + if (call->name() == "glBegin") { insideGlBeginEnd = true; } - if (call->name == "glEnd") { + if (call->name() == "glEnd") { insideGlBeginEnd = false; } diff --git a/stdapi.py b/stdapi.py index 68a837c..c22d88f 100644 --- a/stdapi.py +++ b/stdapi.py @@ -341,7 +341,12 @@ class Arg: class Function: + __id = 0 + def __init__(self, type, name, args, call = '', fail = None, sideeffects=True, hidden=False): + self.id = Function.__id + Function.__id += 1 + self.type = type self.name = name @@ -562,3 +567,11 @@ Double = Literal("double", "Float") SizeT = Literal("size_t", "UInt") WString = Literal("wchar_t *", "WString") +Int8 = Literal("int8_t", "SInt") +UInt8 = Literal("uint8_t", "UInt") +Int16 = Literal("int16_t", "SInt") +UInt16 = Literal("uint16_t", "UInt") +Int32 = Literal("int32_t", "SInt") +UInt32 = Literal("uint32_t", "UInt") +Int64 = Literal("int64_t", "SInt") +UInt64 = Literal("uint64_t", "UInt") diff --git a/trace.py b/trace.py index 95e84b5..da7f9ce 100644 --- a/trace.py +++ b/trace.py @@ -283,6 +283,16 @@ class Tracer: print 'typedef ' + function.prototype('* %s' % ptype) + ';' print 'static %s %s = NULL;' % (ptype, pvalue) print + print 'static const char * __%s_args[] = {' % (function.name) + for arg in function.args: + print ' "%s",' % (arg.name,) + print '};' + print + print 'static const Trace::FunctionSig __%s_sig = {' % (function.name) + print ' %u, "%s", %u, __%s_args' % (int(function.id), function.name, len(function.args), function.name) + print '};' + print + def trace_function_fail(self, function): if function.fail is not None: @@ -316,7 +326,7 @@ class Tracer: print ' %s __result;' % function.type result = '__result = ' self._get_true_pointer(function) - print ' unsigned __call = Trace::BeginEnter("%s");' % (function.name) + print ' unsigned __call = Trace::BeginEnter(__%s_sig);' % (function.name) for arg in function.args: if not arg.output: self.unwrap_arg(function, arg) @@ -338,7 +348,7 @@ class Tracer: print def dump_arg(self, function, arg): - print ' Trace::BeginArg(%u, "%s");' % (arg.index, arg.name,) + print ' Trace::BeginArg(%u);' % (arg.index,) dump_instance(arg.type, arg.name) print ' Trace::EndArg();' @@ -400,7 +410,7 @@ class Tracer: print ' %s __result;' % method.type result = '__result = ' print ' Trace::BeginCall("%s");' % (interface.name + '::' + method.name) - print ' Trace::BeginArg(0, "this");' + print ' Trace::BeginArg(0);' print ' Trace::LiteralOpaque((const void *)m_pInstance);' print ' Trace::EndArg();' for arg in method.args: diff --git a/trace_model.cpp b/trace_model.cpp index e6ec467..b0e5158 100644 --- a/trace_model.cpp +++ b/trace_model.cpp @@ -179,10 +179,10 @@ public: void visit(Call *call) { const char *sep = ""; - os << bold << call->name << normal << "("; - for (std::vector::iterator it = call->args.begin(); it != call->args.end(); ++it) { - os << sep << italic << it->first << normal << " = "; - _visit(it->second); + os << bold << call->sig->name << normal << "("; + for (unsigned i = 0; i < call->args.size(); ++i) { + os << sep << italic << call->sig->arg_names[i] << normal << " = "; + _visit(call->args[i]); sep = ", "; } os << ")"; diff --git a/trace_model.hpp b/trace_model.hpp index 0bcd180..9e2ae97 100644 --- a/trace_model.hpp +++ b/trace_model.hpp @@ -246,20 +246,27 @@ unsigned long long asUInt(const Value &node); double asFloat(const Value &node); -typedef std::pair Arg; - class Call { public: + struct Signature { + std::string name; + std::vector arg_names; + }; + unsigned no; - std::string name; - std::vector args; + const Signature *sig; + std::vector args; Value *ret; - Call() : ret(0) { } + Call(Signature *_sig) : sig(_sig), ret(0) { } + + inline const std::string name(void) const { + return sig->name; + } inline Value & arg(unsigned index) { - return *(args[index].second); + return *(args[index]); } }; diff --git a/trace_parser.hpp b/trace_parser.hpp index b77fc3e..5d51315 100644 --- a/trace_parser.hpp +++ b/trace_parser.hpp @@ -56,6 +56,9 @@ protected: typedef std::map callmap; callmap calls; + typedef std::map FunctionMap; + FunctionMap functions; + typedef std::map BitmaskMap; BitmaskMap bitmasks; @@ -118,9 +121,26 @@ public: } void parse_enter(void) { - Call *call = new Call; + size_t id = read_uint(); + + Call::Signature *sig; + FunctionMap::const_iterator it = functions.find(id); + if (it == functions.end()) { + sig = new Call::Signature; + sig->name = read_string(); + unsigned size = read_uint(); + for (unsigned i = 0; i < size; ++i) { + sig->arg_names.push_back(read_string()); + } + functions[id] = sig; + } else { + sig = it->second; + } + assert(sig); + + Call *call = new Call(sig); call->no = next_call_no++; - call->name = read_name(); + parse_call_details(call); calls[call->no] = call; } @@ -160,12 +180,11 @@ public: void parse_arg(Call *call) { unsigned index = read_uint(); - std::string name = read_name(); Value *value = parse_value(); if (index >= call->args.size()) { call->args.resize(index + 1); } - call->args[index] = Arg(name, value); + call->args[index] = value; } Value *parse_value(void) { diff --git a/trace_write.cpp b/trace_write.cpp index 912824e..3860e31 100644 --- a/trace_write.cpp +++ b/trace_write.cpp @@ -170,11 +170,23 @@ void Close(void) { static unsigned call_no = 0; -unsigned BeginEnter(const char *function) { +static std::map functions; +static std::map bitmasks; + + +unsigned BeginEnter(const FunctionSig &function) { OS::AcquireMutex(); Open(); WriteByte(Trace::EVENT_ENTER); - WriteName(function); + WriteUInt(function.id); + if (!functions[function.id]) { + WriteString(function.name); + WriteUInt(function.num_args); + for (unsigned i = 0; i < function.num_args; ++i) { + WriteString(function.args[i]); + } + functions[function.id] = true; + } return call_no++; } @@ -196,10 +208,9 @@ void EndLeave(void) { OS::ReleaseMutex(); } -void BeginArg(unsigned index, const char *name) { +void BeginArg(unsigned index) { WriteByte(Trace::CALL_ARG); WriteUInt(index); - WriteName(name); } void BeginReturn(void) { @@ -303,8 +314,6 @@ void LiteralNamedConstant(const char *name, long long value) { LiteralSInt(value); } -static std::map bitmasks; - void LiteralBitmask(const BitmaskSig &bitmask, unsigned long long value) { WriteByte(Trace::TYPE_BITMASK); WriteUInt(bitmask.id); diff --git a/trace_write.hpp b/trace_write.hpp index faa36a5..9f9acdb 100644 --- a/trace_write.hpp +++ b/trace_write.hpp @@ -30,6 +30,13 @@ namespace Trace { typedef unsigned Id; + struct FunctionSig { + Id id; + const char *name; + unsigned num_args; + const char **args; + }; + struct BitmaskVal { const char *name; unsigned long long value; @@ -44,13 +51,13 @@ namespace Trace { void Open(void); void Close(void); - unsigned BeginEnter(const char *function); + unsigned BeginEnter(const FunctionSig &function); void EndEnter(void); void BeginLeave(unsigned call); void EndLeave(void); - void BeginArg(unsigned index, const char *name); + void BeginArg(unsigned index); inline void EndArg(void) {} void BeginReturn(void);