[Lldb-commits] [lldb] r320335 - [DataEncoder] Replace buggy versions of write functions.

Davide Italiano via lldb-commits lldb-commits at lists.llvm.org
Sun Dec 10 14:54:07 PST 2017


Author: davide
Date: Sun Dec 10 14:54:07 2017
New Revision: 320335

URL: http://llvm.org/viewvc/llvm-project?rev=320335&view=rev
Log:
[DataEncoder] Replace buggy versions of write functions.

They cause an ubsan error when ran through the testsuite (store
to misaligned address is UB). This commit kills two birds with
one stone, as we also remove some code while fixing it.

<rdar://problem/35941757>

Modified:
    lldb/trunk/source/Utility/DataEncoder.cpp

Modified: lldb/trunk/source/Utility/DataEncoder.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Utility/DataEncoder.cpp?rev=320335&r1=320334&r2=320335&view=diff
==============================================================================
--- lldb/trunk/source/Utility/DataEncoder.cpp (original)
+++ lldb/trunk/source/Utility/DataEncoder.cpp Sun Dec 10 14:54:07 2017
@@ -12,6 +12,7 @@
 #include "lldb/Utility/DataBuffer.h"
 #include "lldb/Utility/Endian.h"
 
+#include "llvm/Support/Endian.h"
 #include "llvm/Support/ErrorHandling.h" // for llvm_unreachable
 #include "llvm/Support/MathExtras.h"
 
@@ -22,36 +23,7 @@
 
 using namespace lldb;
 using namespace lldb_private;
-
-static inline void WriteInt16(unsigned char *ptr, unsigned offset,
-                              uint16_t value) {
-  *(uint16_t *)(ptr + offset) = value;
-}
-
-static inline void WriteInt32(unsigned char *ptr, unsigned offset,
-                              uint32_t value) {
-  *(uint32_t *)(ptr + offset) = value;
-}
-
-static inline void WriteInt64(unsigned char *ptr, unsigned offset,
-                              uint64_t value) {
-  *(uint64_t *)(ptr + offset) = value;
-}
-
-static inline void WriteSwappedInt16(unsigned char *ptr, unsigned offset,
-                                     uint16_t value) {
-  *(uint16_t *)(ptr + offset) = llvm::ByteSwap_16(value);
-}
-
-static inline void WriteSwappedInt32(unsigned char *ptr, unsigned offset,
-                                     uint32_t value) {
-  *(uint32_t *)(ptr + offset) = llvm::ByteSwap_32(value);
-}
-
-static inline void WriteSwappedInt64(unsigned char *ptr, unsigned offset,
-                                     uint64_t value) {
-  *(uint64_t *)(ptr + offset) = llvm::ByteSwap_64(value);
-}
+using namespace llvm::support::endian;
 
 //----------------------------------------------------------------------
 // Default constructor.
@@ -202,9 +174,9 @@ uint32_t DataEncoder::PutU8(uint32_t off
 uint32_t DataEncoder::PutU16(uint32_t offset, uint16_t value) {
   if (ValidOffsetForDataOfSize(offset, sizeof(value))) {
     if (m_byte_order != endian::InlHostByteOrder())
-      WriteSwappedInt16(m_start, offset, value);
+      write16be(m_start, offset + value);
     else
-      WriteInt16(m_start, offset, value);
+      write16le(m_start, offset + value);
 
     return offset + sizeof(value);
   }
@@ -214,9 +186,9 @@ uint32_t DataEncoder::PutU16(uint32_t of
 uint32_t DataEncoder::PutU32(uint32_t offset, uint32_t value) {
   if (ValidOffsetForDataOfSize(offset, sizeof(value))) {
     if (m_byte_order != endian::InlHostByteOrder())
-      WriteSwappedInt32(m_start, offset, value);
+      write32be(m_start, offset + value);
     else
-      WriteInt32(m_start, offset, value);
+      write32le(m_start, offset + value);
 
     return offset + sizeof(value);
   }
@@ -226,9 +198,9 @@ uint32_t DataEncoder::PutU32(uint32_t of
 uint32_t DataEncoder::PutU64(uint32_t offset, uint64_t value) {
   if (ValidOffsetForDataOfSize(offset, sizeof(value))) {
     if (m_byte_order != endian::InlHostByteOrder())
-      WriteSwappedInt64(m_start, offset, value);
+      write64be(m_start, offset + value);
     else
-      WriteInt64(m_start, offset, value);
+      write64le(m_start, offset + value);
 
     return offset + sizeof(value);
   }




More information about the lldb-commits mailing list