]> git.cworth.org Git - apitrace/blobdiff - common/trace_writer.cpp
cli: use $LIB to handle multilib automagically on glibc
[apitrace] / common / trace_writer.cpp
index be0137619c853cb185abba5d6f84e438c4965e62..e7e3df212cd393cd6801672a97d47cc982335b4f 100644 (file)
@@ -35,7 +35,6 @@
 #include "trace_file.hpp"
 #include "trace_writer.hpp"
 #include "trace_format.hpp"
-#include "trace_backtrace.hpp"
 
 namespace trace {
 
@@ -72,6 +71,7 @@ Writer::open(const char *filename) {
     structs.clear();
     enums.clear();
     bitmasks.clear();
+    frames.clear();
 
     _writeUInt(TRACE_VERSION);
 
@@ -135,71 +135,41 @@ inline bool lookup(std::vector<bool> &map, size_t index) {
     }
 }
 
-void Writer::writeBacktrace(std::vector<RawStackFrame> backtrace) {
+void Writer::beginBacktrace(unsigned num_frames) {
+    if (num_frames) {
+        _writeByte(trace::CALL_BACKTRACE);
+        _writeUInt(num_frames);
+    }
+}
 
-    for (int i = 0; i < backtrace.size(); i++) {
-        beginStackFrame();
-        if (backtrace[i].module != NULL) {
-            beginStackFrameModule();
-            writeString(backtrace[i].module);
-            endStackFrameModule();
+void Writer::writeStackFrame(const RawStackFrame *frame) {
+    _writeUInt(frame->id);
+    if (!lookup(frames, frame->id)) {
+        if (frame->module != NULL) {
+            _writeByte(trace::BACKTRACE_MODULE);
+            _writeString(frame->module);
         }
-        if (backtrace[i].function != NULL) {
-            beginStackFrameFunction();
-            writeString(backtrace[i].function);
-            endStackFrameFunction();
+        if (frame->function != NULL) {
+            _writeByte(trace::BACKTRACE_FUNCTION);
+            _writeString(frame->function);
         }
-        if (backtrace[i].filename != NULL) {
-            beginStackFrameFilename();
-            writeString(backtrace[i].filename);
-            endStackFrameFilename();
+        if (frame->filename != NULL) {
+            _writeByte(trace::BACKTRACE_FILENAME);
+            _writeString(frame->filename);
         }
-        if (backtrace[i].linenumber != NULL) {
-            beginStackFrameLinenumber();
-            writeString(backtrace[i].linenumber);
-            endStackFrameLinenumber();
+        if (frame->linenumber >= 0) {
+            _writeByte(trace::BACKTRACE_LINENUMBER);
+            _writeUInt(frame->linenumber);
         }
-        if (backtrace[i].offset != NULL) {
-            beginStackFrameOffset();
-            writeString(backtrace[i].offset);
-            endStackFrameOffset();
+        if (frame->offset >= 0) {
+            _writeByte(trace::BACKTRACE_OFFSET);
+            _writeUInt(frame->offset);
         }
-        endStackFrame();
+        _writeByte(trace::BACKTRACE_END);
+        frames[frame->id] = true;
     }
 }
 
-void Writer::beginBacktrace(void ) {
-    _writeByte(trace::CALL_BACKTRACE);
-}
-
-void Writer::endBacktrace(void ) {
-    _writeByte(trace::CALL_BACKTRACE_END);
-}
-
-void Writer::beginStackFrame(void ) {
-    _writeByte(trace::CALL_BACKTRACE_FRAME);
-}
-
-void Writer::beginStackFrameModule(void ) {
-    _writeByte(trace::CALL_BACKTRACE_MODULE);
-}
-
-void Writer::beginStackFrameFunction(void ) {
-    _writeByte(trace::CALL_BACKTRACE_FUNCTION);
-}
-
-void Writer::beginStackFrameFilename(void ) {
-    _writeByte(trace::CALL_BACKTRACE_FILENAME);
-}
-
-void Writer::beginStackFrameLinenumber(void ) {
-    _writeByte(trace::CALL_BACKTRACE_LINENUMBER);
-}
-
-void Writer::beginStackFrameOffset(void ) {
-    _writeByte(trace::CALL_BACKTRACE_OFFSET);
-}
-
 unsigned Writer::beginEnter(const FunctionSig *sig, unsigned thread_id) {
     _writeByte(trace::EVENT_ENTER);
     _writeUInt(thread_id);