From: José Fonseca Date: Sun, 15 Apr 2012 15:13:51 +0000 (+0100) Subject: Cleanup how pointers are handled. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;ds=sidebyside;h=d559f02eff13e695d0005251dea3e920b20ded65;p=apitrace Cleanup how pointers are handled. In particular prevent high order bits to be lost when processing on 64bits traces on 32bits platforms. --- diff --git a/common/trace_writer.cpp b/common/trace_writer.cpp index 5708e50..f4b82d8 100644 --- a/common/trace_writer.cpp +++ b/common/trace_writer.cpp @@ -294,13 +294,13 @@ void Writer::writeNull(void) { _writeByte(trace::TYPE_NULL); } -void Writer::writeOpaque(const void *addr) { +void Writer::writePointer(unsigned long long addr) { if (!addr) { Writer::writeNull(); return; } _writeByte(trace::TYPE_OPAQUE); - _writeUInt((size_t)addr); + _writeUInt(addr); } diff --git a/common/trace_writer.hpp b/common/trace_writer.hpp index e012a9b..5f18f74 100644 --- a/common/trace_writer.hpp +++ b/common/trace_writer.hpp @@ -91,7 +91,7 @@ namespace trace { void writeEnum(const EnumSig *sig, signed long long value); void writeBitmask(const BitmaskSig *sig, unsigned long long value); void writeNull(void); - void writeOpaque(const void *ptr); + void writePointer(unsigned long long addr); void writeCall(Call *call); diff --git a/common/trace_writer_local.hpp b/common/trace_writer_local.hpp index e54142f..c00818b 100644 --- a/common/trace_writer_local.hpp +++ b/common/trace_writer_local.hpp @@ -31,6 +31,8 @@ #define _TRACE_WRITER_LOCAL_HPP_ +#include + #include "os_thread.hpp" #include "trace_writer.hpp" diff --git a/common/trace_writer_model.cpp b/common/trace_writer_model.cpp index 96544d1..9bd9ae6 100644 --- a/common/trace_writer_model.cpp +++ b/common/trace_writer_model.cpp @@ -97,7 +97,7 @@ public: } void visit(Pointer *node) { - writer.writeOpaque((const void *) (size_t) node->value); + writer.writePointer(node->value); } void visit(Call *call) { diff --git a/gui/saverthread.cpp b/gui/saverthread.cpp index 54ef5d2..fc6a023 100644 --- a/gui/saverthread.cpp +++ b/gui/saverthread.cpp @@ -189,11 +189,7 @@ writeValue(trace::Writer &writer, const QVariant &var, unsigned &id) deleteStructSig(str); } else if (type == pointerType) { ApiPointer apiPtr = var.value(); - //writer.beginArray(1); - //writer.beginElement(); - writer.writeOpaque((const void*)apiPtr.value()); - //writer.endElement(); - //writer.endArray(); + writer.writePointer(apiPtr.value()); } else if (type == enumType) { ApiEnum apiEnum = var.value(); trace::EnumSig *sig = createEnumSig(apiEnum, ++id); diff --git a/wrappers/d3dshader.cpp b/wrappers/d3dshader.cpp index a2d5c12..ee9cd9a 100644 --- a/wrappers/d3dshader.cpp +++ b/wrappers/d3dshader.cpp @@ -78,7 +78,7 @@ found: LPD3DXBUFFER pDisassembly = NULL; HRESULT hr; - hr = pfnD3DXDisassembleShader( (DWORD *)tokens, FALSE, NULL, &pDisassembly); + hr = pfnD3DXDisassembleShader(tokens, FALSE, NULL, &pDisassembly); if (hr == D3D_OK) { writer.writeString((const char *)pDisassembly->GetBufferPointer()); } @@ -92,5 +92,5 @@ found: } } - writer.writeOpaque(tokens); + writer.writePointer((UINT_PTR)tokens); } diff --git a/wrappers/gltrace.py b/wrappers/gltrace.py index 9f60acb..cdf8e55 100644 --- a/wrappers/gltrace.py +++ b/wrappers/gltrace.py @@ -811,7 +811,7 @@ class GlTracer(Tracer): print ' if (ctx->profile == gltrace::PROFILE_COMPAT)' print ' __glGetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &__unpack_buffer);' print ' if (__unpack_buffer) {' - print ' trace::localWriter.writeOpaque(%s);' % arg.name + print ' trace::localWriter.writePointer((uintptr_t)%s);' % arg.name print ' } else {' Tracer.serializeArgValue(self, function, arg) print ' }' diff --git a/wrappers/trace.py b/wrappers/trace.py index 6cb7934..dd9fdd7 100644 --- a/wrappers/trace.py +++ b/wrappers/trace.py @@ -218,13 +218,13 @@ class ValueSerializer(stdapi.Visitor): print ' }' def visitIntPointer(self, pointer, instance): - print ' trace::localWriter.writeOpaque((const void *)%s);' % instance + print ' trace::localWriter.writePointer((uintptr_t)%s);' % instance def visitObjPointer(self, pointer, instance): - print ' trace::localWriter.writeOpaque((const void *)%s);' % instance + print ' trace::localWriter.writePointer((uintptr_t)%s);' % instance def visitLinearPointer(self, pointer, instance): - print ' trace::localWriter.writeOpaque((const void *)%s);' % instance + print ' trace::localWriter.writePointer((uintptr_t)%s);' % instance def visitReference(self, reference, instance): self.visit(reference.type, instance) @@ -236,10 +236,10 @@ class ValueSerializer(stdapi.Visitor): self.visit(alias.type, instance) def visitOpaque(self, opaque, instance): - print ' trace::localWriter.writeOpaque((const void *)%s);' % instance + print ' trace::localWriter.writePointer((uintptr_t)%s);' % instance def visitInterface(self, interface, instance): - print ' trace::localWriter.writeOpaque((const void *)&%s);' % instance + assert False def visitPolymorphic(self, polymorphic, instance): print ' _write__%s(%s, %s);' % (polymorphic.tag, polymorphic.switchExpr, instance) @@ -556,7 +556,7 @@ class Tracer: print ' static const trace::FunctionSig __sig = {%u, "%s", %u, __args};' % (method.id, interface.name + '::' + method.name, len(method.args) + 1) print ' unsigned __call = trace::localWriter.beginEnter(&__sig);' print ' trace::localWriter.beginArg(0);' - print ' trace::localWriter.writeOpaque((const void *)m_pInstance);' + print ' trace::localWriter.writePointer((uintptr_t)m_pInstance);' print ' trace::localWriter.endArg();' for arg in method.args: if not arg.output: @@ -637,7 +637,7 @@ class Tracer: def emit_memcpy(self, dest, src, length): print ' unsigned __call = trace::localWriter.beginEnter(&trace::memcpy_sig);' print ' trace::localWriter.beginArg(0);' - print ' trace::localWriter.writeOpaque(%s);' % dest + print ' trace::localWriter.writePointer((uintptr_t)%s);' % dest print ' trace::localWriter.endArg();' print ' trace::localWriter.beginArg(1);' print ' trace::localWriter.writeBlob(%s, %s);' % (src, length)