Teach ValueObject::ReadPointedString how to read char[] in host memory
authorEnrico Granata <egranata@apple.com>
Tue, 30 Aug 2016 21:33:47 +0000 (21:33 +0000)
committerEnrico Granata <egranata@apple.com>
Tue, 30 Aug 2016 21:33:47 +0000 (21:33 +0000)
llvm-svn: 280166

lldb/source/Core/ValueObject.cpp

index 3e0a318..609c518 100644 (file)
@@ -1224,7 +1224,8 @@ ValueObject::ReadPointedString (lldb::DataBufferSP& buffer_sp,
         
         size_t cstr_len = 0;
         bool capped_data = false;
-        if (type_flags.Test (eTypeIsArray))
+        const bool is_array = type_flags.Test (eTypeIsArray);
+        if (is_array)
         {
             // We have an array
             uint64_t array_size = 0;
@@ -1247,10 +1248,20 @@ ValueObject::ReadPointedString (lldb::DataBufferSP& buffer_sp,
         
         if (cstr_address == 0 || cstr_address == LLDB_INVALID_ADDRESS)
         {
-            s << "<invalid address>";
-            error.SetErrorString("invalid address");
-            CopyStringDataToBufferSP(s, buffer_sp);
-            return {0,was_capped};
+            if (cstr_address_type == eAddressTypeHost && is_array)
+            {
+                const char* cstr = GetDataExtractor().PeekCStr(0);
+                buffer_sp.reset(new DataBufferHeap(cstr_len, 0));
+                memcpy(buffer_sp->GetBytes(), cstr, cstr_len);
+                return {cstr_len,was_capped};
+            }
+            else
+            {
+                s << "<invalid address>";
+                error.SetErrorString("invalid address");
+                CopyStringDataToBufferSP(s, buffer_sp);
+                return {0,was_capped};
+            }
         }
         
         Address cstr_so_addr (cstr_address);