Index: lldb/include/lldb/Utility/DataExtractor.h =================================================================== --- lldb/include/lldb/Utility/DataExtractor.h +++ lldb/include/lldb/Utility/DataExtractor.h @@ -9,6 +9,7 @@ #ifndef LLDB_UTILITY_DATAEXTRACTOR_H #define LLDB_UTILITY_DATAEXTRACTOR_H +#include "lldb/Utility/Endian.h" #include "lldb/lldb-defines.h" #include "lldb/lldb-enumerations.h" #include "lldb/lldb-forward.h" @@ -20,6 +21,11 @@ #include #include +#ifndef __builtin_is_aligned +#define __builtin_is_aligned(POINTER, BYTE_COUNT) \ + (((uintptr_t)(const void *)(POINTER)) % (BYTE_COUNT) == 0) +#endif + namespace lldb_private { class Log; class Stream; @@ -979,6 +985,28 @@ } protected: + template T Get(lldb::offset_t *offset_ptr) const { + constexpr size_t src_size = sizeof(T); + + const T *src = static_cast(GetData(offset_ptr, src_size)); + + if (!src) + return 0.0; + + assert(__builtin_is_aligned(src, alignof(T))); + + if (m_byte_order != endian::InlHostByteOrder()) { + T val = 0.0; + uint8_t *dst_data = reinterpret_cast(&val); + const uint8_t *src_data = reinterpret_cast(src); + for (size_t i = 0; i < src_size; ++i) + dst_data[src_size - 1 - i] = src_data[i]; + return val; + } + + return *src; + } + // Member variables const uint8_t *m_start; ///< A pointer to the first byte of data. const uint8_t Index: lldb/source/Utility/DataExtractor.cpp =================================================================== --- lldb/source/Utility/DataExtractor.cpp +++ lldb/source/Utility/DataExtractor.cpp @@ -15,7 +15,6 @@ #include "lldb/Utility/DataBuffer.h" #include "lldb/Utility/DataBufferHeap.h" -#include "lldb/Utility/Endian.h" #include "lldb/Utility/LLDBAssert.h" #include "lldb/Utility/Log.h" #include "lldb/Utility/Stream.h" @@ -624,41 +623,11 @@ } float DataExtractor::GetFloat(offset_t *offset_ptr) const { - typedef float float_type; - float_type val = 0.0; - const size_t src_size = sizeof(float_type); - const float_type *src = - static_cast(GetData(offset_ptr, src_size)); - if (src) { - if (m_byte_order != endian::InlHostByteOrder()) { - const uint8_t *src_data = reinterpret_cast(src); - uint8_t *dst_data = reinterpret_cast(&val); - for (size_t i = 0; i < sizeof(float_type); ++i) - dst_data[sizeof(float_type) - 1 - i] = src_data[i]; - } else { - val = *src; - } - } - return val; + return Get(offset_ptr); } double DataExtractor::GetDouble(offset_t *offset_ptr) const { - typedef double float_type; - float_type val = 0.0; - const size_t src_size = sizeof(float_type); - const float_type *src = - static_cast(GetData(offset_ptr, src_size)); - if (src) { - if (m_byte_order != endian::InlHostByteOrder()) { - const uint8_t *src_data = reinterpret_cast(src); - uint8_t *dst_data = reinterpret_cast(&val); - for (size_t i = 0; i < sizeof(float_type); ++i) - dst_data[sizeof(float_type) - 1 - i] = src_data[i]; - } else { - val = *src; - } - } - return val; + return Get(offset_ptr); } long double DataExtractor::GetLongDouble(offset_t *offset_ptr) const {