Miscellaneous fixes for big-endian systems
authorUlrich Weigand <ulrich.weigand@de.ibm.com>
Thu, 14 Apr 2016 14:33:47 +0000 (14:33 +0000)
committerUlrich Weigand <ulrich.weigand@de.ibm.com>
Thu, 14 Apr 2016 14:33:47 +0000 (14:33 +0000)
commit0501eebda6f030151ebe923bea3b543623b6435e
treee8f3b9bab3651a74d39214a1126be79080981e86
parent461bd680c33f35b90843072fd558bbd03b12de3c
Miscellaneous fixes for big-endian systems

This patch fixes a bunch of issues that show up on big-endian systems:

- The gnu_libstdcpp.py script doesn't follow the way libstdc++ encodes
  bit vectors: it should identify the enclosing *word* and then access
  the appropriate bit within that word.  Instead, the script simply
  operates on bytes.  This gives the same result on little-endian
  systems, but not on big-endian.

- lldb_private::formatters::WCharSummaryProvider always assumes wchar_t
  is UTF16, even though it could also be UTF8 or UTF32.  This is mostly
  not an issue on little-endian systems, but immediately fails on BE.
  Fixed by checking the size of wchar_t like WCharStringSummaryProvider
  already does.

- ClangASTContext::GetChildCompilerTypeAtIndex uses uint32_t to access
  the virtual base offset stored in the vtable, even though the size
  of this field matches the target pointer size according to the C++
  ABI.  Again, this is mostly not visible on LE, but fails on BE.

- Process::ReadStringFromMemory uses strncmp to search for a terminator
  consisting of multiple zero bytes.  This doesn't work since strncmp
  will stop already at the first zero byte.  Use memcmp instead.

Differential Revision: http://reviews.llvm.org/D18983

llvm-svn: 266313
lldb/examples/synthetic/gnu_libstdcpp.py
lldb/source/Plugins/Language/CPlusPlus/CxxStringTypes.cpp
lldb/source/Symbol/ClangASTContext.cpp
lldb/source/Target/Process.cpp