[Lldb-commits] [lldb] 91aa67b - [lldb/Reproducers] Add (de)serialization overload for char**

Jonas Devlieghere via lldb-commits lldb-commits at lists.llvm.org
Wed Jan 29 14:08:36 PST 2020


Author: Jonas Devlieghere
Date: 2020-01-29T14:08:21-08:00
New Revision: 91aa67bf290bc7f877b1b90128284863bc31aa43

URL: https://github.com/llvm/llvm-project/commit/91aa67bf290bc7f877b1b90128284863bc31aa43
DIFF: https://github.com/llvm/llvm-project/commit/91aa67bf290bc7f877b1b90128284863bc31aa43.diff

LOG: [lldb/Reproducers] Add (de)serialization overload for char**

This patch adds an overload to serialize and deserialize char** types.
This is necessary for things like the SBLaunchInfo ctor. We serialize
the array length followed by each individual item.

Added: 
    

Modified: 
    lldb/include/lldb/Utility/ReproducerInstrumentation.h
    lldb/source/Utility/ReproducerInstrumentation.cpp

Removed: 
    


################################################################################
diff  --git a/lldb/include/lldb/Utility/ReproducerInstrumentation.h b/lldb/include/lldb/Utility/ReproducerInstrumentation.h
index 2698338a38bb..ca92f9f2f6e6 100644
--- a/lldb/include/lldb/Utility/ReproducerInstrumentation.h
+++ b/lldb/include/lldb/Utility/ReproducerInstrumentation.h
@@ -375,6 +375,7 @@ class Deserializer {
 /// Partial specialization for C-style strings. We read the string value
 /// instead of treating it as pointer.
 template <> const char *Deserializer::Deserialize<const char *>();
+template <> const char **Deserializer::Deserialize<const char **>();
 template <> char *Deserializer::Deserialize<char *>();
 
 /// Helpers to auto-synthesize function replay code. It deserializes the replay
@@ -604,6 +605,22 @@ class Serializer {
     m_stream.write(0x0);
   }
 
+  void Serialize(const char **t) {
+    // Compute the size of the array.
+    const char *const *temp = t;
+    size_t size = 0;
+    while (*temp++)
+      size++;
+    Serialize(size);
+
+    // Serialize the content of the array.
+    while (*t) {
+      m_stream << *t;
+      m_stream.write(0x0);
+      ++t;
+    }
+  }
+
   /// Serialization stream.
   llvm::raw_ostream &m_stream;
 

diff  --git a/lldb/source/Utility/ReproducerInstrumentation.cpp b/lldb/source/Utility/ReproducerInstrumentation.cpp
index 46def9f59d7b..fb39fec41d43 100644
--- a/lldb/source/Utility/ReproducerInstrumentation.cpp
+++ b/lldb/source/Utility/ReproducerInstrumentation.cpp
@@ -9,6 +9,7 @@
 #include "lldb/Utility/ReproducerInstrumentation.h"
 #include "lldb/Utility/Reproducer.h"
 #include <stdio.h>
+#include <stdlib.h>
 
 using namespace lldb_private;
 using namespace lldb_private::repro;
@@ -39,6 +40,15 @@ template <> const char *Deserializer::Deserialize<const char *>() {
   return str;
 }
 
+template <> const char **Deserializer::Deserialize<const char **>() {
+  size_t size = Deserialize<size_t>();
+  const char **r =
+      reinterpret_cast<const char **>(calloc(size + 1, sizeof(char *)));
+  for (size_t i = 0; i < size; ++i)
+    r[i] = Deserialize<const char *>();
+  return r;
+}
+
 bool Registry::Replay(const FileSpec &file) {
   auto error_or_file = llvm::MemoryBuffer::getFile(file.GetPath());
   if (auto err = error_or_file.getError())


        


More information about the lldb-commits mailing list