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" @@ -979,6 +980,27 @@ } protected: + template T Get(lldb::offset_t *offset_ptr, T fail_value) const { + constexpr size_t src_size = sizeof(T); + T val = fail_value; + + const T *src = static_cast(GetData(offset_ptr, src_size)); + if (!src) + return val; + + 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 < src_size; ++i) + dst_data[src_size - 1 - i] = src_data[i]; + return val; + } else { + memcpy(&val, src, src_size); + } + + return val; + } + // 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, 0.0); } 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, 0.0); } long double DataExtractor::GetLongDouble(offset_t *offset_ptr) const {