[Lldb-commits] [PATCH] D18983: Miscellaneous fixes for big-endian systems

Ulrich Weigand via lldb-commits lldb-commits at lists.llvm.org
Thu Apr 14 07:39:18 PDT 2016


This revision was automatically updated to reflect the committed changes.
Closed by commit rL266313: Miscellaneous fixes for big-endian systems (authored by uweigand).

Changed prior to commit:
  http://reviews.llvm.org/D18983?vs=53299&id=53712#toc

Repository:
  rL LLVM

http://reviews.llvm.org/D18983

Files:
  lldb/trunk/examples/synthetic/gnu_libstdcpp.py
  lldb/trunk/source/Plugins/Language/CPlusPlus/CxxStringTypes.cpp
  lldb/trunk/source/Symbol/ClangASTContext.cpp
  lldb/trunk/source/Target/Process.cpp

Index: lldb/trunk/examples/synthetic/gnu_libstdcpp.py
===================================================================
--- lldb/trunk/examples/synthetic/gnu_libstdcpp.py
+++ lldb/trunk/examples/synthetic/gnu_libstdcpp.py
@@ -237,11 +237,12 @@
 		def get_child_at_index(self, index):
 			if index >= self.num_children():
 				return None
-			byte_offset = index / 8
-			bit_offset = index % 8
-			element_size = self.start_p.GetType().GetPointeeType().GetByteSize()
-			data = self.start_p.GetPointeeData(byte_offset / element_size)
-			bit = data.GetUnsignedInt8(lldb.SBError(), byte_offset % element_size) & (1 << bit_offset)
+			element_type = self.start_p.GetType().GetPointeeType()
+			element_bits = 8 * element_type.GetByteSize()
+			element_offset = index / element_bits
+			bit_offset = index % element_bits
+			element = self.start_p.CreateChildAtOffset('['+str(index)+']',element_offset,element_type)
+			bit = element.GetValueAsUnsigned(0) & (1 << bit_offset)
 			if bit != 0:
 				value_expr = "(bool)true"
 			else:
Index: lldb/trunk/source/Target/Process.cpp
===================================================================
--- lldb/trunk/source/Target/Process.cpp
+++ lldb/trunk/source/Target/Process.cpp
@@ -2437,7 +2437,7 @@
             // Search for a null terminator of correct size and alignment in bytes_read
             size_t aligned_start = total_bytes_read - total_bytes_read % type_width;
             for (size_t i = aligned_start; i + type_width <= total_bytes_read + bytes_read; i += type_width)
-                if (::strncmp(&dst[i], terminator, type_width) == 0)
+                if (::memcmp(&dst[i], terminator, type_width) == 0)
                 {
                     error.Clear();
                     return i;
Index: lldb/trunk/source/Symbol/ClangASTContext.cpp
===================================================================
--- lldb/trunk/source/Symbol/ClangASTContext.cpp
+++ lldb/trunk/source/Symbol/ClangASTContext.cpp
@@ -6075,8 +6075,9 @@
                                                         {
                                                             clang::CharUnits base_offset_offset = itanium_vtable_ctx->getVirtualBaseOffsetOffset(cxx_record_decl, base_class_decl);
                                                             const lldb::addr_t base_offset_addr = vtable_ptr + base_offset_offset.getQuantity();
-                                                            const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
-                                                            if (base_offset != UINT32_MAX)
+                                                            const uint32_t base_offset_size = process->GetAddressByteSize();
+                                                            const uint64_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, base_offset_size, UINT32_MAX, err);
+                                                            if (base_offset < UINT32_MAX)
                                                             {
                                                                 handled = true;
                                                                 bit_offset = base_offset * 8;
Index: lldb/trunk/source/Plugins/Language/CPlusPlus/CxxStringTypes.cpp
===================================================================
--- lldb/trunk/source/Plugins/Language/CPlusPlus/CxxStringTypes.cpp
+++ lldb/trunk/source/Plugins/Language/CPlusPlus/CxxStringTypes.cpp
@@ -192,13 +192,33 @@
     if (error.Fail())
         return false;
     
+    // Get a wchar_t basic type from the current type system
+    CompilerType wchar_compiler_type = valobj.GetCompilerType().GetBasicTypeFromAST(lldb::eBasicTypeWChar);
+
+    if (!wchar_compiler_type)
+        return false;
+
+    const uint32_t wchar_size = wchar_compiler_type.GetBitSize(nullptr); // Safe to pass NULL for exe_scope here
+
     StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj);
     options.SetData(data);
     options.SetStream(&stream);
     options.SetPrefixToken("L");
     options.SetQuote('\'');
     options.SetSourceSize(1);
     options.SetBinaryZeroIsTerminator(false);
     
-    return StringPrinter::ReadBufferAndDumpToStream<StringPrinter::StringElementType::UTF16>(options);
+    switch (wchar_size)
+    {
+        case 8:
+            return StringPrinter::ReadBufferAndDumpToStream<StringPrinter::StringElementType::UTF8>(options);
+        case 16:
+            return StringPrinter::ReadBufferAndDumpToStream<StringPrinter::StringElementType::UTF16>(options);
+        case 32:
+            return StringPrinter::ReadBufferAndDumpToStream<StringPrinter::StringElementType::UTF32>(options);
+        default:
+            stream.Printf("size for wchar_t is not valid");
+            return true;
+    }
+    return true;
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D18983.53712.patch
Type: text/x-patch
Size: 4912 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160414/6cdbf248/attachment-0001.bin>


More information about the lldb-commits mailing list