Index: lldb/source/Core/DumpDataExtractor.cpp =================================================================== --- lldb/source/Core/DumpDataExtractor.cpp +++ lldb/source/Core/DumpDataExtractor.cpp @@ -141,7 +141,7 @@ return start_offset; if (item_format == eFormatPointer) { - if (item_byte_size != 4 && item_byte_size != 8) + if (item_byte_size != 2 && item_byte_size != 4 && item_byte_size != 8) item_byte_size = s->GetAddressByteSize(); } Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugArangeSet.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugArangeSet.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugArangeSet.cpp @@ -68,7 +68,7 @@ return llvm::make_error( "Invalid arange header version"); - if (m_header.addr_size != 4 && m_header.addr_size != 8) + if (m_header.addr_size != 2 && m_header.addr_size != 4 && m_header.addr_size != 8) return llvm::make_error( "Invalid arange header address size"); Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp @@ -809,7 +809,7 @@ bool length_OK = data.ValidOffset(header.GetNextUnitOffset() - 1); bool version_OK = SymbolFileDWARF::SupportedVersion(header.m_version); - bool addr_size_OK = (header.m_addr_size == 4) || (header.m_addr_size == 8); + bool addr_size_OK = (header.m_addr_size == 2) || (header.m_addr_size == 4) || (header.m_addr_size == 8); bool type_offset_OK = !header.IsTypeUnit() || (header.m_type_offset <= header.GetLength()); Index: lldb/source/Symbol/DWARFCallFrameInfo.cpp =================================================================== --- lldb/source/Symbol/DWARFCallFrameInfo.cpp +++ lldb/source/Symbol/DWARFCallFrameInfo.cpp @@ -39,7 +39,7 @@ uint64_t baseAddress = 0; uint64_t addressValue = 0; const uint32_t addr_size = DE.GetAddressByteSize(); - assert(addr_size == 4 || addr_size == 8); + assert(addr_size == 2 || addr_size == 4 || addr_size == 8); bool signExtendValue = false; // Decode the base part or adjust our offset Index: lldb/source/Utility/DataExtractor.cpp =================================================================== --- lldb/source/Utility/DataExtractor.cpp +++ lldb/source/Utility/DataExtractor.cpp @@ -133,7 +133,7 @@ m_end(const_cast(static_cast(data)) + length), m_byte_order(endian), m_addr_size(addr_size), m_data_sp(), m_target_byte_size(target_byte_size) { - assert(addr_size == 4 || addr_size == 8); + assert(addr_size == 2 || addr_size == 4 || addr_size == 8); } // Make a shared pointer reference to the shared data in "data_sp" and set the @@ -146,7 +146,7 @@ : m_start(nullptr), m_end(nullptr), m_byte_order(endian), m_addr_size(addr_size), m_data_sp(), m_target_byte_size(target_byte_size) { - assert(addr_size == 4 || addr_size == 8); + assert(addr_size == 2 || addr_size == 4 || addr_size == 8); SetData(data_sp); } @@ -160,7 +160,7 @@ : m_start(nullptr), m_end(nullptr), m_byte_order(data.m_byte_order), m_addr_size(data.m_addr_size), m_data_sp(), m_target_byte_size(target_byte_size) { - assert(m_addr_size == 4 || m_addr_size == 8); + assert(m_addr_size == 2 || m_addr_size == 4 || m_addr_size == 8); if (data.ValidOffset(offset)) { offset_t bytes_available = data.GetByteSize() - offset; if (length > bytes_available) @@ -173,7 +173,7 @@ : m_start(rhs.m_start), m_end(rhs.m_end), m_byte_order(rhs.m_byte_order), m_addr_size(rhs.m_addr_size), m_data_sp(rhs.m_data_sp), m_target_byte_size(rhs.m_target_byte_size) { - assert(m_addr_size == 4 || m_addr_size == 8); + assert(m_addr_size == 2 || m_addr_size == 4 || m_addr_size == 8); } // Assignment operator @@ -251,7 +251,7 @@ offset_t data_offset, offset_t data_length) { m_addr_size = data.m_addr_size; - assert(m_addr_size == 4 || m_addr_size == 8); + assert(m_addr_size == 2 || m_addr_size == 4 || m_addr_size == 8); // If "data" contains shared pointer to data, then we can use that if (data.m_data_sp) { m_byte_order = data.m_byte_order; @@ -679,12 +679,12 @@ // // RETURNS the address that was extracted, or zero on failure. uint64_t DataExtractor::GetAddress(offset_t *offset_ptr) const { - assert(m_addr_size == 4 || m_addr_size == 8); + assert(m_addr_size == 2 || m_addr_size == 4 || m_addr_size == 8); return GetMaxU64(offset_ptr, m_addr_size); } uint64_t DataExtractor::GetAddress_unchecked(offset_t *offset_ptr) const { - assert(m_addr_size == 4 || m_addr_size == 8); + assert(m_addr_size == 2 || m_addr_size == 4 || m_addr_size == 8); return GetMaxU64_unchecked(offset_ptr, m_addr_size); } @@ -695,7 +695,7 @@ // // RETURNS the pointer that was extracted, or zero on failure. uint64_t DataExtractor::GetPointer(offset_t *offset_ptr) const { - assert(m_addr_size == 4 || m_addr_size == 8); + assert(m_addr_size == 2 || m_addr_size == 4 || m_addr_size == 8); return GetMaxU64(offset_ptr, m_addr_size); } Index: llvm/lib/DebugInfo/DWARF/DWARFDebugAddr.cpp =================================================================== --- llvm/lib/DebugInfo/DWARF/DWARFDebugAddr.cpp +++ llvm/lib/DebugInfo/DWARF/DWARFDebugAddr.cpp @@ -131,7 +131,9 @@ Data.setAddressSize(HeaderData.AddrSize); uint32_t AddrCount = DataSize / HeaderData.AddrSize; for (uint32_t I = 0; I < AddrCount; ++I) - if (HeaderData.AddrSize == 4) + if (HeaderData.AddrSize == 2) + Addrs.push_back(Data.getU16(OffsetPtr)); + else if (HeaderData.AddrSize == 4) Addrs.push_back(Data.getU32(OffsetPtr)); else Addrs.push_back(Data.getU64(OffsetPtr));