129cb868aSZachary Turner //===-- DumpDataExtractor.cpp -----------------------------------*- C++ -*-===// 229cb868aSZachary Turner // 329cb868aSZachary Turner // The LLVM Compiler Infrastructure 429cb868aSZachary Turner // 529cb868aSZachary Turner // This file is distributed under the University of Illinois Open Source 629cb868aSZachary Turner // License. See LICENSE.TXT for details. 729cb868aSZachary Turner // 829cb868aSZachary Turner //===----------------------------------------------------------------------===// 929cb868aSZachary Turner 1029cb868aSZachary Turner #include "lldb/Core/DumpDataExtractor.h" 1129cb868aSZachary Turner 12*2f3df613SZachary Turner #include "lldb/lldb-defines.h" // for LLDB_INVALID_ADDRESS 13*2f3df613SZachary Turner #include "lldb/lldb-forward.h" // for TargetSP, DisassemblerSP 14*2f3df613SZachary Turner 15*2f3df613SZachary Turner #include "lldb/Core/Address.h" // for Address 1629cb868aSZachary Turner #include "lldb/Core/Disassembler.h" 17*2f3df613SZachary Turner #include "lldb/Core/ModuleList.h" // for ModuleList 1829cb868aSZachary Turner #include "lldb/Symbol/ClangASTContext.h" 1929cb868aSZachary Turner #include "lldb/Target/ExecutionContext.h" 2029cb868aSZachary Turner #include "lldb/Target/ExecutionContextScope.h" 2129cb868aSZachary Turner #include "lldb/Target/SectionLoadList.h" 2229cb868aSZachary Turner #include "lldb/Target/Target.h" 23666cc0b2SZachary Turner #include "lldb/Utility/DataExtractor.h" 2429cb868aSZachary Turner #include "lldb/Utility/Stream.h" 2529cb868aSZachary Turner 26*2f3df613SZachary Turner #include "clang/AST/ASTContext.h" // for ASTContext 27*2f3df613SZachary Turner #include "clang/AST/CanonicalType.h" // for CanQualType 28*2f3df613SZachary Turner 29*2f3df613SZachary Turner #include "llvm/ADT/APFloat.h" // for APFloat, APFloatBase:... 30*2f3df613SZachary Turner #include "llvm/ADT/APInt.h" // for APInt 31*2f3df613SZachary Turner #include "llvm/ADT/ArrayRef.h" // for ArrayRef 32*2f3df613SZachary Turner #include "llvm/ADT/SmallVector.h" // for SmallVector 33*2f3df613SZachary Turner 34*2f3df613SZachary Turner #include <limits> // for numeric_limits, numer... 35*2f3df613SZachary Turner #include <memory> // for shared_ptr 36*2f3df613SZachary Turner #include <string> // for string, basic_string 37*2f3df613SZachary Turner 38*2f3df613SZachary Turner #include <assert.h> // for assert 39*2f3df613SZachary Turner #include <ctype.h> // for isprint 40*2f3df613SZachary Turner #include <inttypes.h> // for PRIu64, PRIx64, PRIX64 41*2f3df613SZachary Turner #include <math.h> // for ldexpf 42*2f3df613SZachary Turner 4329cb868aSZachary Turner #include <bitset> 4429cb868aSZachary Turner #include <sstream> 4529cb868aSZachary Turner 4629cb868aSZachary Turner using namespace lldb_private; 4729cb868aSZachary Turner using namespace lldb; 4829cb868aSZachary Turner 4929cb868aSZachary Turner #define NON_PRINTABLE_CHAR '.' 5029cb868aSZachary Turner 5129cb868aSZachary Turner static float half2float(uint16_t half) { 5229cb868aSZachary Turner union { 5329cb868aSZachary Turner float f; 5429cb868aSZachary Turner uint32_t u; 5529cb868aSZachary Turner } u; 5629cb868aSZachary Turner int32_t v = (int16_t)half; 5729cb868aSZachary Turner 5829cb868aSZachary Turner if (0 == (v & 0x7c00)) { 5929cb868aSZachary Turner u.u = v & 0x80007FFFU; 6029cb868aSZachary Turner return u.f * ldexpf(1, 125); 6129cb868aSZachary Turner } 6229cb868aSZachary Turner 6329cb868aSZachary Turner v <<= 13; 6429cb868aSZachary Turner u.u = v | 0x70000000U; 6529cb868aSZachary Turner return u.f * ldexpf(1, -112); 6629cb868aSZachary Turner } 6729cb868aSZachary Turner 6829cb868aSZachary Turner static bool GetAPInt(const DataExtractor &data, lldb::offset_t *offset_ptr, 6929cb868aSZachary Turner lldb::offset_t byte_size, llvm::APInt &result) { 7029cb868aSZachary Turner llvm::SmallVector<uint64_t, 2> uint64_array; 7129cb868aSZachary Turner lldb::offset_t bytes_left = byte_size; 7229cb868aSZachary Turner uint64_t u64; 7329cb868aSZachary Turner const lldb::ByteOrder byte_order = data.GetByteOrder(); 7429cb868aSZachary Turner if (byte_order == lldb::eByteOrderLittle) { 7529cb868aSZachary Turner while (bytes_left > 0) { 7629cb868aSZachary Turner if (bytes_left >= 8) { 7729cb868aSZachary Turner u64 = data.GetU64(offset_ptr); 7829cb868aSZachary Turner bytes_left -= 8; 7929cb868aSZachary Turner } else { 8029cb868aSZachary Turner u64 = data.GetMaxU64(offset_ptr, (uint32_t)bytes_left); 8129cb868aSZachary Turner bytes_left = 0; 8229cb868aSZachary Turner } 8329cb868aSZachary Turner uint64_array.push_back(u64); 8429cb868aSZachary Turner } 8529cb868aSZachary Turner result = llvm::APInt(byte_size * 8, llvm::ArrayRef<uint64_t>(uint64_array)); 8629cb868aSZachary Turner return true; 8729cb868aSZachary Turner } else if (byte_order == lldb::eByteOrderBig) { 8829cb868aSZachary Turner lldb::offset_t be_offset = *offset_ptr + byte_size; 8929cb868aSZachary Turner lldb::offset_t temp_offset; 9029cb868aSZachary Turner while (bytes_left > 0) { 9129cb868aSZachary Turner if (bytes_left >= 8) { 9229cb868aSZachary Turner be_offset -= 8; 9329cb868aSZachary Turner temp_offset = be_offset; 9429cb868aSZachary Turner u64 = data.GetU64(&temp_offset); 9529cb868aSZachary Turner bytes_left -= 8; 9629cb868aSZachary Turner } else { 9729cb868aSZachary Turner be_offset -= bytes_left; 9829cb868aSZachary Turner temp_offset = be_offset; 9929cb868aSZachary Turner u64 = data.GetMaxU64(&temp_offset, (uint32_t)bytes_left); 10029cb868aSZachary Turner bytes_left = 0; 10129cb868aSZachary Turner } 10229cb868aSZachary Turner uint64_array.push_back(u64); 10329cb868aSZachary Turner } 10429cb868aSZachary Turner *offset_ptr += byte_size; 10529cb868aSZachary Turner result = llvm::APInt(byte_size * 8, llvm::ArrayRef<uint64_t>(uint64_array)); 10629cb868aSZachary Turner return true; 10729cb868aSZachary Turner } 10829cb868aSZachary Turner return false; 10929cb868aSZachary Turner } 11029cb868aSZachary Turner 11129cb868aSZachary Turner static lldb::offset_t DumpAPInt(Stream *s, const DataExtractor &data, 11229cb868aSZachary Turner lldb::offset_t offset, lldb::offset_t byte_size, 11329cb868aSZachary Turner bool is_signed, unsigned radix) { 11429cb868aSZachary Turner llvm::APInt apint; 11529cb868aSZachary Turner if (GetAPInt(data, &offset, byte_size, apint)) { 11629cb868aSZachary Turner std::string apint_str(apint.toString(radix, is_signed)); 11729cb868aSZachary Turner switch (radix) { 11829cb868aSZachary Turner case 2: 11929cb868aSZachary Turner s->Write("0b", 2); 12029cb868aSZachary Turner break; 12129cb868aSZachary Turner case 8: 12229cb868aSZachary Turner s->Write("0", 1); 12329cb868aSZachary Turner break; 12429cb868aSZachary Turner case 10: 12529cb868aSZachary Turner break; 12629cb868aSZachary Turner } 12729cb868aSZachary Turner s->Write(apint_str.c_str(), apint_str.size()); 12829cb868aSZachary Turner } 12929cb868aSZachary Turner return offset; 13029cb868aSZachary Turner } 13129cb868aSZachary Turner 13229cb868aSZachary Turner lldb::offset_t lldb_private::DumpDataExtractor( 13329cb868aSZachary Turner const DataExtractor &DE, Stream *s, offset_t start_offset, 13429cb868aSZachary Turner lldb::Format item_format, size_t item_byte_size, size_t item_count, 13529cb868aSZachary Turner size_t num_per_line, uint64_t base_addr, 13629cb868aSZachary Turner uint32_t item_bit_size, // If zero, this is not a bitfield value, if 13729cb868aSZachary Turner // non-zero, the value is a bitfield 13829cb868aSZachary Turner uint32_t item_bit_offset, // If "item_bit_size" is non-zero, this is the 13929cb868aSZachary Turner // shift amount to apply to a bitfield 14029cb868aSZachary Turner ExecutionContextScope *exe_scope) { 14129cb868aSZachary Turner if (s == nullptr) 14229cb868aSZachary Turner return start_offset; 14329cb868aSZachary Turner 14429cb868aSZachary Turner if (item_format == eFormatPointer) { 14529cb868aSZachary Turner if (item_byte_size != 4 && item_byte_size != 8) 14629cb868aSZachary Turner item_byte_size = s->GetAddressByteSize(); 14729cb868aSZachary Turner } 14829cb868aSZachary Turner 14929cb868aSZachary Turner offset_t offset = start_offset; 15029cb868aSZachary Turner 15129cb868aSZachary Turner if (item_format == eFormatInstruction) { 15229cb868aSZachary Turner TargetSP target_sp; 15329cb868aSZachary Turner if (exe_scope) 15429cb868aSZachary Turner target_sp = exe_scope->CalculateTarget(); 15529cb868aSZachary Turner if (target_sp) { 15629cb868aSZachary Turner DisassemblerSP disassembler_sp(Disassembler::FindPlugin( 15729cb868aSZachary Turner target_sp->GetArchitecture(), nullptr, nullptr)); 15829cb868aSZachary Turner if (disassembler_sp) { 15929cb868aSZachary Turner lldb::addr_t addr = base_addr + start_offset; 16029cb868aSZachary Turner lldb_private::Address so_addr; 16129cb868aSZachary Turner bool data_from_file = true; 16229cb868aSZachary Turner if (target_sp->GetSectionLoadList().ResolveLoadAddress(addr, so_addr)) { 16329cb868aSZachary Turner data_from_file = false; 16429cb868aSZachary Turner } else { 16529cb868aSZachary Turner if (target_sp->GetSectionLoadList().IsEmpty() || 16629cb868aSZachary Turner !target_sp->GetImages().ResolveFileAddress(addr, so_addr)) 16729cb868aSZachary Turner so_addr.SetRawAddress(addr); 16829cb868aSZachary Turner } 16929cb868aSZachary Turner 17029cb868aSZachary Turner size_t bytes_consumed = disassembler_sp->DecodeInstructions( 17129cb868aSZachary Turner so_addr, DE, start_offset, item_count, false, data_from_file); 17229cb868aSZachary Turner 17329cb868aSZachary Turner if (bytes_consumed) { 17429cb868aSZachary Turner offset += bytes_consumed; 17529cb868aSZachary Turner const bool show_address = base_addr != LLDB_INVALID_ADDRESS; 17629cb868aSZachary Turner const bool show_bytes = true; 17729cb868aSZachary Turner ExecutionContext exe_ctx; 17829cb868aSZachary Turner exe_scope->CalculateExecutionContext(exe_ctx); 17929cb868aSZachary Turner disassembler_sp->GetInstructionList().Dump(s, show_address, 18029cb868aSZachary Turner show_bytes, &exe_ctx); 18129cb868aSZachary Turner } 18229cb868aSZachary Turner } 18329cb868aSZachary Turner } else 18429cb868aSZachary Turner s->Printf("invalid target"); 18529cb868aSZachary Turner 18629cb868aSZachary Turner return offset; 18729cb868aSZachary Turner } 18829cb868aSZachary Turner 18929cb868aSZachary Turner if ((item_format == eFormatOSType || item_format == eFormatAddressInfo) && 19029cb868aSZachary Turner item_byte_size > 8) 19129cb868aSZachary Turner item_format = eFormatHex; 19229cb868aSZachary Turner 19329cb868aSZachary Turner lldb::offset_t line_start_offset = start_offset; 19429cb868aSZachary Turner for (uint32_t count = 0; DE.ValidOffset(offset) && count < item_count; 19529cb868aSZachary Turner ++count) { 19629cb868aSZachary Turner if ((count % num_per_line) == 0) { 19729cb868aSZachary Turner if (count > 0) { 19829cb868aSZachary Turner if (item_format == eFormatBytesWithASCII && 19929cb868aSZachary Turner offset > line_start_offset) { 20029cb868aSZachary Turner s->Printf("%*s", 20129cb868aSZachary Turner static_cast<int>( 20229cb868aSZachary Turner (num_per_line - (offset - line_start_offset)) * 3 + 2), 20329cb868aSZachary Turner ""); 20429cb868aSZachary Turner DumpDataExtractor(DE, s, line_start_offset, eFormatCharPrintable, 1, 20529cb868aSZachary Turner offset - line_start_offset, SIZE_MAX, 20629cb868aSZachary Turner LLDB_INVALID_ADDRESS, 0, 0); 20729cb868aSZachary Turner } 20829cb868aSZachary Turner s->EOL(); 20929cb868aSZachary Turner } 21029cb868aSZachary Turner if (base_addr != LLDB_INVALID_ADDRESS) 21129cb868aSZachary Turner s->Printf("0x%8.8" PRIx64 ": ", 21229cb868aSZachary Turner (uint64_t)(base_addr + 21329cb868aSZachary Turner (offset - start_offset) / DE.getTargetByteSize())); 21429cb868aSZachary Turner 21529cb868aSZachary Turner line_start_offset = offset; 21629cb868aSZachary Turner } else if (item_format != eFormatChar && 21729cb868aSZachary Turner item_format != eFormatCharPrintable && 21829cb868aSZachary Turner item_format != eFormatCharArray && count > 0) { 21929cb868aSZachary Turner s->PutChar(' '); 22029cb868aSZachary Turner } 22129cb868aSZachary Turner 22229cb868aSZachary Turner switch (item_format) { 22329cb868aSZachary Turner case eFormatBoolean: 22429cb868aSZachary Turner if (item_byte_size <= 8) 22529cb868aSZachary Turner s->Printf("%s", DE.GetMaxU64Bitfield(&offset, item_byte_size, 22629cb868aSZachary Turner item_bit_size, item_bit_offset) 22729cb868aSZachary Turner ? "true" 22829cb868aSZachary Turner : "false"); 22929cb868aSZachary Turner else { 23029cb868aSZachary Turner s->Printf("error: unsupported byte size (%" PRIu64 23129cb868aSZachary Turner ") for boolean format", 23229cb868aSZachary Turner (uint64_t)item_byte_size); 23329cb868aSZachary Turner return offset; 23429cb868aSZachary Turner } 23529cb868aSZachary Turner break; 23629cb868aSZachary Turner 23729cb868aSZachary Turner case eFormatBinary: 23829cb868aSZachary Turner if (item_byte_size <= 8) { 23929cb868aSZachary Turner uint64_t uval64 = DE.GetMaxU64Bitfield(&offset, item_byte_size, 24029cb868aSZachary Turner item_bit_size, item_bit_offset); 24129cb868aSZachary Turner // Avoid std::bitset<64>::to_string() since it is missing in 24229cb868aSZachary Turner // earlier C++ libraries 24329cb868aSZachary Turner std::string binary_value(64, '0'); 24429cb868aSZachary Turner std::bitset<64> bits(uval64); 24529cb868aSZachary Turner for (uint32_t i = 0; i < 64; ++i) 24629cb868aSZachary Turner if (bits[i]) 24729cb868aSZachary Turner binary_value[64 - 1 - i] = '1'; 24829cb868aSZachary Turner if (item_bit_size > 0) 24929cb868aSZachary Turner s->Printf("0b%s", binary_value.c_str() + 64 - item_bit_size); 25029cb868aSZachary Turner else if (item_byte_size > 0 && item_byte_size <= 8) 25129cb868aSZachary Turner s->Printf("0b%s", binary_value.c_str() + 64 - item_byte_size * 8); 25229cb868aSZachary Turner } else { 25329cb868aSZachary Turner const bool is_signed = false; 25429cb868aSZachary Turner const unsigned radix = 2; 25529cb868aSZachary Turner offset = DumpAPInt(s, DE, offset, item_byte_size, is_signed, radix); 25629cb868aSZachary Turner } 25729cb868aSZachary Turner break; 25829cb868aSZachary Turner 25929cb868aSZachary Turner case eFormatBytes: 26029cb868aSZachary Turner case eFormatBytesWithASCII: 26129cb868aSZachary Turner for (uint32_t i = 0; i < item_byte_size; ++i) { 26229cb868aSZachary Turner s->Printf("%2.2x", DE.GetU8(&offset)); 26329cb868aSZachary Turner } 26429cb868aSZachary Turner 26529cb868aSZachary Turner // Put an extra space between the groups of bytes if more than one 26629cb868aSZachary Turner // is being dumped in a group (item_byte_size is more than 1). 26729cb868aSZachary Turner if (item_byte_size > 1) 26829cb868aSZachary Turner s->PutChar(' '); 26929cb868aSZachary Turner break; 27029cb868aSZachary Turner 27129cb868aSZachary Turner case eFormatChar: 27229cb868aSZachary Turner case eFormatCharPrintable: 27329cb868aSZachary Turner case eFormatCharArray: { 27429cb868aSZachary Turner // If we are only printing one character surround it with single 27529cb868aSZachary Turner // quotes 27629cb868aSZachary Turner if (item_count == 1 && item_format == eFormatChar) 27729cb868aSZachary Turner s->PutChar('\''); 27829cb868aSZachary Turner 27929cb868aSZachary Turner const uint64_t ch = DE.GetMaxU64Bitfield(&offset, item_byte_size, 28029cb868aSZachary Turner item_bit_size, item_bit_offset); 28129cb868aSZachary Turner if (isprint(ch)) 28229cb868aSZachary Turner s->Printf("%c", (char)ch); 28329cb868aSZachary Turner else if (item_format != eFormatCharPrintable) { 28429cb868aSZachary Turner switch (ch) { 28529cb868aSZachary Turner case '\033': 28629cb868aSZachary Turner s->Printf("\\e"); 28729cb868aSZachary Turner break; 28829cb868aSZachary Turner case '\a': 28929cb868aSZachary Turner s->Printf("\\a"); 29029cb868aSZachary Turner break; 29129cb868aSZachary Turner case '\b': 29229cb868aSZachary Turner s->Printf("\\b"); 29329cb868aSZachary Turner break; 29429cb868aSZachary Turner case '\f': 29529cb868aSZachary Turner s->Printf("\\f"); 29629cb868aSZachary Turner break; 29729cb868aSZachary Turner case '\n': 29829cb868aSZachary Turner s->Printf("\\n"); 29929cb868aSZachary Turner break; 30029cb868aSZachary Turner case '\r': 30129cb868aSZachary Turner s->Printf("\\r"); 30229cb868aSZachary Turner break; 30329cb868aSZachary Turner case '\t': 30429cb868aSZachary Turner s->Printf("\\t"); 30529cb868aSZachary Turner break; 30629cb868aSZachary Turner case '\v': 30729cb868aSZachary Turner s->Printf("\\v"); 30829cb868aSZachary Turner break; 30929cb868aSZachary Turner case '\0': 31029cb868aSZachary Turner s->Printf("\\0"); 31129cb868aSZachary Turner break; 31229cb868aSZachary Turner default: 31329cb868aSZachary Turner if (item_byte_size == 1) 31429cb868aSZachary Turner s->Printf("\\x%2.2x", (uint8_t)ch); 31529cb868aSZachary Turner else 31629cb868aSZachary Turner s->Printf("%" PRIu64, ch); 31729cb868aSZachary Turner break; 31829cb868aSZachary Turner } 31929cb868aSZachary Turner } else { 32029cb868aSZachary Turner s->PutChar(NON_PRINTABLE_CHAR); 32129cb868aSZachary Turner } 32229cb868aSZachary Turner 32329cb868aSZachary Turner // If we are only printing one character surround it with single quotes 32429cb868aSZachary Turner if (item_count == 1 && item_format == eFormatChar) 32529cb868aSZachary Turner s->PutChar('\''); 32629cb868aSZachary Turner } break; 32729cb868aSZachary Turner 32829cb868aSZachary Turner case eFormatEnum: // Print enum value as a signed integer when we don't get 32929cb868aSZachary Turner // the enum type 33029cb868aSZachary Turner case eFormatDecimal: 33129cb868aSZachary Turner if (item_byte_size <= 8) 33229cb868aSZachary Turner s->Printf("%" PRId64, 33329cb868aSZachary Turner DE.GetMaxS64Bitfield(&offset, item_byte_size, item_bit_size, 33429cb868aSZachary Turner item_bit_offset)); 33529cb868aSZachary Turner else { 33629cb868aSZachary Turner const bool is_signed = true; 33729cb868aSZachary Turner const unsigned radix = 10; 33829cb868aSZachary Turner offset = DumpAPInt(s, DE, offset, item_byte_size, is_signed, radix); 33929cb868aSZachary Turner } 34029cb868aSZachary Turner break; 34129cb868aSZachary Turner 34229cb868aSZachary Turner case eFormatUnsigned: 34329cb868aSZachary Turner if (item_byte_size <= 8) 34429cb868aSZachary Turner s->Printf("%" PRIu64, 34529cb868aSZachary Turner DE.GetMaxU64Bitfield(&offset, item_byte_size, item_bit_size, 34629cb868aSZachary Turner item_bit_offset)); 34729cb868aSZachary Turner else { 34829cb868aSZachary Turner const bool is_signed = false; 34929cb868aSZachary Turner const unsigned radix = 10; 35029cb868aSZachary Turner offset = DumpAPInt(s, DE, offset, item_byte_size, is_signed, radix); 35129cb868aSZachary Turner } 35229cb868aSZachary Turner break; 35329cb868aSZachary Turner 35429cb868aSZachary Turner case eFormatOctal: 35529cb868aSZachary Turner if (item_byte_size <= 8) 35629cb868aSZachary Turner s->Printf("0%" PRIo64, 35729cb868aSZachary Turner DE.GetMaxS64Bitfield(&offset, item_byte_size, item_bit_size, 35829cb868aSZachary Turner item_bit_offset)); 35929cb868aSZachary Turner else { 36029cb868aSZachary Turner const bool is_signed = false; 36129cb868aSZachary Turner const unsigned radix = 8; 36229cb868aSZachary Turner offset = DumpAPInt(s, DE, offset, item_byte_size, is_signed, radix); 36329cb868aSZachary Turner } 36429cb868aSZachary Turner break; 36529cb868aSZachary Turner 36629cb868aSZachary Turner case eFormatOSType: { 36729cb868aSZachary Turner uint64_t uval64 = DE.GetMaxU64Bitfield(&offset, item_byte_size, 36829cb868aSZachary Turner item_bit_size, item_bit_offset); 36929cb868aSZachary Turner s->PutChar('\''); 37029cb868aSZachary Turner for (uint32_t i = 0; i < item_byte_size; ++i) { 37129cb868aSZachary Turner uint8_t ch = (uint8_t)(uval64 >> ((item_byte_size - i - 1) * 8)); 37229cb868aSZachary Turner if (isprint(ch)) 37329cb868aSZachary Turner s->Printf("%c", ch); 37429cb868aSZachary Turner else { 37529cb868aSZachary Turner switch (ch) { 37629cb868aSZachary Turner case '\033': 37729cb868aSZachary Turner s->Printf("\\e"); 37829cb868aSZachary Turner break; 37929cb868aSZachary Turner case '\a': 38029cb868aSZachary Turner s->Printf("\\a"); 38129cb868aSZachary Turner break; 38229cb868aSZachary Turner case '\b': 38329cb868aSZachary Turner s->Printf("\\b"); 38429cb868aSZachary Turner break; 38529cb868aSZachary Turner case '\f': 38629cb868aSZachary Turner s->Printf("\\f"); 38729cb868aSZachary Turner break; 38829cb868aSZachary Turner case '\n': 38929cb868aSZachary Turner s->Printf("\\n"); 39029cb868aSZachary Turner break; 39129cb868aSZachary Turner case '\r': 39229cb868aSZachary Turner s->Printf("\\r"); 39329cb868aSZachary Turner break; 39429cb868aSZachary Turner case '\t': 39529cb868aSZachary Turner s->Printf("\\t"); 39629cb868aSZachary Turner break; 39729cb868aSZachary Turner case '\v': 39829cb868aSZachary Turner s->Printf("\\v"); 39929cb868aSZachary Turner break; 40029cb868aSZachary Turner case '\0': 40129cb868aSZachary Turner s->Printf("\\0"); 40229cb868aSZachary Turner break; 40329cb868aSZachary Turner default: 40429cb868aSZachary Turner s->Printf("\\x%2.2x", ch); 40529cb868aSZachary Turner break; 40629cb868aSZachary Turner } 40729cb868aSZachary Turner } 40829cb868aSZachary Turner } 40929cb868aSZachary Turner s->PutChar('\''); 41029cb868aSZachary Turner } break; 41129cb868aSZachary Turner 41229cb868aSZachary Turner case eFormatCString: { 41329cb868aSZachary Turner const char *cstr = DE.GetCStr(&offset); 41429cb868aSZachary Turner 41529cb868aSZachary Turner if (!cstr) { 41629cb868aSZachary Turner s->Printf("NULL"); 41729cb868aSZachary Turner offset = LLDB_INVALID_OFFSET; 41829cb868aSZachary Turner } else { 41929cb868aSZachary Turner s->PutChar('\"'); 42029cb868aSZachary Turner 42129cb868aSZachary Turner while (const char c = *cstr) { 42229cb868aSZachary Turner if (isprint(c)) { 42329cb868aSZachary Turner s->PutChar(c); 42429cb868aSZachary Turner } else { 42529cb868aSZachary Turner switch (c) { 42629cb868aSZachary Turner case '\033': 42729cb868aSZachary Turner s->Printf("\\e"); 42829cb868aSZachary Turner break; 42929cb868aSZachary Turner case '\a': 43029cb868aSZachary Turner s->Printf("\\a"); 43129cb868aSZachary Turner break; 43229cb868aSZachary Turner case '\b': 43329cb868aSZachary Turner s->Printf("\\b"); 43429cb868aSZachary Turner break; 43529cb868aSZachary Turner case '\f': 43629cb868aSZachary Turner s->Printf("\\f"); 43729cb868aSZachary Turner break; 43829cb868aSZachary Turner case '\n': 43929cb868aSZachary Turner s->Printf("\\n"); 44029cb868aSZachary Turner break; 44129cb868aSZachary Turner case '\r': 44229cb868aSZachary Turner s->Printf("\\r"); 44329cb868aSZachary Turner break; 44429cb868aSZachary Turner case '\t': 44529cb868aSZachary Turner s->Printf("\\t"); 44629cb868aSZachary Turner break; 44729cb868aSZachary Turner case '\v': 44829cb868aSZachary Turner s->Printf("\\v"); 44929cb868aSZachary Turner break; 45029cb868aSZachary Turner default: 45129cb868aSZachary Turner s->Printf("\\x%2.2x", c); 45229cb868aSZachary Turner break; 45329cb868aSZachary Turner } 45429cb868aSZachary Turner } 45529cb868aSZachary Turner 45629cb868aSZachary Turner ++cstr; 45729cb868aSZachary Turner } 45829cb868aSZachary Turner 45929cb868aSZachary Turner s->PutChar('\"'); 46029cb868aSZachary Turner } 46129cb868aSZachary Turner } break; 46229cb868aSZachary Turner 46329cb868aSZachary Turner case eFormatPointer: 46429cb868aSZachary Turner s->Address(DE.GetMaxU64Bitfield(&offset, item_byte_size, item_bit_size, 46529cb868aSZachary Turner item_bit_offset), 46629cb868aSZachary Turner sizeof(addr_t)); 46729cb868aSZachary Turner break; 46829cb868aSZachary Turner 46929cb868aSZachary Turner case eFormatComplexInteger: { 47029cb868aSZachary Turner size_t complex_int_byte_size = item_byte_size / 2; 47129cb868aSZachary Turner 47229cb868aSZachary Turner if (complex_int_byte_size > 0 && complex_int_byte_size <= 8) { 47329cb868aSZachary Turner s->Printf("%" PRIu64, 47429cb868aSZachary Turner DE.GetMaxU64Bitfield(&offset, complex_int_byte_size, 0, 0)); 47529cb868aSZachary Turner s->Printf(" + %" PRIu64 "i", 47629cb868aSZachary Turner DE.GetMaxU64Bitfield(&offset, complex_int_byte_size, 0, 0)); 47729cb868aSZachary Turner } else { 47829cb868aSZachary Turner s->Printf("error: unsupported byte size (%" PRIu64 47929cb868aSZachary Turner ") for complex integer format", 48029cb868aSZachary Turner (uint64_t)item_byte_size); 48129cb868aSZachary Turner return offset; 48229cb868aSZachary Turner } 48329cb868aSZachary Turner } break; 48429cb868aSZachary Turner 48529cb868aSZachary Turner case eFormatComplex: 48629cb868aSZachary Turner if (sizeof(float) * 2 == item_byte_size) { 48729cb868aSZachary Turner float f32_1 = DE.GetFloat(&offset); 48829cb868aSZachary Turner float f32_2 = DE.GetFloat(&offset); 48929cb868aSZachary Turner 49029cb868aSZachary Turner s->Printf("%g + %gi", f32_1, f32_2); 49129cb868aSZachary Turner break; 49229cb868aSZachary Turner } else if (sizeof(double) * 2 == item_byte_size) { 49329cb868aSZachary Turner double d64_1 = DE.GetDouble(&offset); 49429cb868aSZachary Turner double d64_2 = DE.GetDouble(&offset); 49529cb868aSZachary Turner 49629cb868aSZachary Turner s->Printf("%lg + %lgi", d64_1, d64_2); 49729cb868aSZachary Turner break; 49829cb868aSZachary Turner } else if (sizeof(long double) * 2 == item_byte_size) { 49929cb868aSZachary Turner long double ld64_1 = DE.GetLongDouble(&offset); 50029cb868aSZachary Turner long double ld64_2 = DE.GetLongDouble(&offset); 50129cb868aSZachary Turner s->Printf("%Lg + %Lgi", ld64_1, ld64_2); 50229cb868aSZachary Turner break; 50329cb868aSZachary Turner } else { 50429cb868aSZachary Turner s->Printf("error: unsupported byte size (%" PRIu64 50529cb868aSZachary Turner ") for complex float format", 50629cb868aSZachary Turner (uint64_t)item_byte_size); 50729cb868aSZachary Turner return offset; 50829cb868aSZachary Turner } 50929cb868aSZachary Turner break; 51029cb868aSZachary Turner 51129cb868aSZachary Turner default: 51229cb868aSZachary Turner case eFormatDefault: 51329cb868aSZachary Turner case eFormatHex: 51429cb868aSZachary Turner case eFormatHexUppercase: { 51529cb868aSZachary Turner bool wantsuppercase = (item_format == eFormatHexUppercase); 51629cb868aSZachary Turner switch (item_byte_size) { 51729cb868aSZachary Turner case 1: 51829cb868aSZachary Turner case 2: 51929cb868aSZachary Turner case 4: 52029cb868aSZachary Turner case 8: 52129cb868aSZachary Turner s->Printf(wantsuppercase ? "0x%*.*" PRIX64 : "0x%*.*" PRIx64, 52229cb868aSZachary Turner (int)(2 * item_byte_size), (int)(2 * item_byte_size), 52329cb868aSZachary Turner DE.GetMaxU64Bitfield(&offset, item_byte_size, item_bit_size, 52429cb868aSZachary Turner item_bit_offset)); 52529cb868aSZachary Turner break; 52629cb868aSZachary Turner default: { 52729cb868aSZachary Turner assert(item_bit_size == 0 && item_bit_offset == 0); 52829cb868aSZachary Turner const uint8_t *bytes = 52929cb868aSZachary Turner (const uint8_t *)DE.GetData(&offset, item_byte_size); 53029cb868aSZachary Turner if (bytes) { 53129cb868aSZachary Turner s->PutCString("0x"); 53229cb868aSZachary Turner uint32_t idx; 53329cb868aSZachary Turner if (DE.GetByteOrder() == eByteOrderBig) { 53429cb868aSZachary Turner for (idx = 0; idx < item_byte_size; ++idx) 53529cb868aSZachary Turner s->Printf(wantsuppercase ? "%2.2X" : "%2.2x", bytes[idx]); 53629cb868aSZachary Turner } else { 53729cb868aSZachary Turner for (idx = 0; idx < item_byte_size; ++idx) 53829cb868aSZachary Turner s->Printf(wantsuppercase ? "%2.2X" : "%2.2x", 53929cb868aSZachary Turner bytes[item_byte_size - 1 - idx]); 54029cb868aSZachary Turner } 54129cb868aSZachary Turner } 54229cb868aSZachary Turner } break; 54329cb868aSZachary Turner } 54429cb868aSZachary Turner } break; 54529cb868aSZachary Turner 54629cb868aSZachary Turner case eFormatFloat: { 54729cb868aSZachary Turner TargetSP target_sp; 54829cb868aSZachary Turner bool used_apfloat = false; 54929cb868aSZachary Turner if (exe_scope) 55029cb868aSZachary Turner target_sp = exe_scope->CalculateTarget(); 55129cb868aSZachary Turner if (target_sp) { 55229cb868aSZachary Turner ClangASTContext *clang_ast = target_sp->GetScratchClangASTContext(); 55329cb868aSZachary Turner if (clang_ast) { 55429cb868aSZachary Turner clang::ASTContext *ast = clang_ast->getASTContext(); 55529cb868aSZachary Turner if (ast) { 55629cb868aSZachary Turner llvm::SmallVector<char, 256> sv; 55729cb868aSZachary Turner // Show full precision when printing float values 55829cb868aSZachary Turner const unsigned format_precision = 0; 55929cb868aSZachary Turner const unsigned format_max_padding = 100; 56029cb868aSZachary Turner size_t item_bit_size = item_byte_size * 8; 56129cb868aSZachary Turner 56229cb868aSZachary Turner if (item_bit_size == ast->getTypeSize(ast->FloatTy)) { 56329cb868aSZachary Turner llvm::APInt apint(item_bit_size, 56429cb868aSZachary Turner DE.GetMaxU64(&offset, item_byte_size)); 56529cb868aSZachary Turner llvm::APFloat apfloat(ast->getFloatTypeSemantics(ast->FloatTy), 56629cb868aSZachary Turner apint); 56729cb868aSZachary Turner apfloat.toString(sv, format_precision, format_max_padding); 56829cb868aSZachary Turner } else if (item_bit_size == ast->getTypeSize(ast->DoubleTy)) { 56929cb868aSZachary Turner llvm::APInt apint; 57029cb868aSZachary Turner if (GetAPInt(DE, &offset, item_byte_size, apint)) { 57129cb868aSZachary Turner llvm::APFloat apfloat(ast->getFloatTypeSemantics(ast->DoubleTy), 57229cb868aSZachary Turner apint); 57329cb868aSZachary Turner apfloat.toString(sv, format_precision, format_max_padding); 57429cb868aSZachary Turner } 57529cb868aSZachary Turner } else if (item_bit_size == ast->getTypeSize(ast->LongDoubleTy)) { 57629cb868aSZachary Turner const auto &semantics = 57729cb868aSZachary Turner ast->getFloatTypeSemantics(ast->LongDoubleTy); 57829cb868aSZachary Turner const auto byte_size = 57929cb868aSZachary Turner (llvm::APFloat::getSizeInBits(semantics) + 7) / 8; 58029cb868aSZachary Turner 58129cb868aSZachary Turner llvm::APInt apint; 58229cb868aSZachary Turner if (GetAPInt(DE, &offset, byte_size, apint)) { 58329cb868aSZachary Turner llvm::APFloat apfloat(semantics, apint); 58429cb868aSZachary Turner apfloat.toString(sv, format_precision, format_max_padding); 58529cb868aSZachary Turner } 58629cb868aSZachary Turner } else if (item_bit_size == ast->getTypeSize(ast->HalfTy)) { 58729cb868aSZachary Turner llvm::APInt apint(item_bit_size, DE.GetU16(&offset)); 58829cb868aSZachary Turner llvm::APFloat apfloat(ast->getFloatTypeSemantics(ast->HalfTy), 58929cb868aSZachary Turner apint); 59029cb868aSZachary Turner apfloat.toString(sv, format_precision, format_max_padding); 59129cb868aSZachary Turner } 59229cb868aSZachary Turner 59329cb868aSZachary Turner if (!sv.empty()) { 59429cb868aSZachary Turner s->Printf("%*.*s", (int)sv.size(), (int)sv.size(), sv.data()); 59529cb868aSZachary Turner used_apfloat = true; 59629cb868aSZachary Turner } 59729cb868aSZachary Turner } 59829cb868aSZachary Turner } 59929cb868aSZachary Turner } 60029cb868aSZachary Turner 60129cb868aSZachary Turner if (!used_apfloat) { 60229cb868aSZachary Turner std::ostringstream ss; 60329cb868aSZachary Turner if (item_byte_size == sizeof(float) || item_byte_size == 2) { 60429cb868aSZachary Turner float f; 60529cb868aSZachary Turner if (item_byte_size == 2) { 60629cb868aSZachary Turner uint16_t half = DE.GetU16(&offset); 60729cb868aSZachary Turner f = half2float(half); 60829cb868aSZachary Turner } else { 60929cb868aSZachary Turner f = DE.GetFloat(&offset); 61029cb868aSZachary Turner } 61129cb868aSZachary Turner ss.precision(std::numeric_limits<float>::digits10); 61229cb868aSZachary Turner ss << f; 61329cb868aSZachary Turner } else if (item_byte_size == sizeof(double)) { 61429cb868aSZachary Turner ss.precision(std::numeric_limits<double>::digits10); 61529cb868aSZachary Turner ss << DE.GetDouble(&offset); 61629cb868aSZachary Turner } else if (item_byte_size == sizeof(long double) || 61729cb868aSZachary Turner item_byte_size == 10) { 61829cb868aSZachary Turner ss.precision(std::numeric_limits<long double>::digits10); 61929cb868aSZachary Turner ss << DE.GetLongDouble(&offset); 62029cb868aSZachary Turner } else { 62129cb868aSZachary Turner s->Printf("error: unsupported byte size (%" PRIu64 62229cb868aSZachary Turner ") for float format", 62329cb868aSZachary Turner (uint64_t)item_byte_size); 62429cb868aSZachary Turner return offset; 62529cb868aSZachary Turner } 62629cb868aSZachary Turner ss.flush(); 62729cb868aSZachary Turner s->Printf("%s", ss.str().c_str()); 62829cb868aSZachary Turner } 62929cb868aSZachary Turner } break; 63029cb868aSZachary Turner 63129cb868aSZachary Turner case eFormatUnicode16: 63229cb868aSZachary Turner s->Printf("U+%4.4x", DE.GetU16(&offset)); 63329cb868aSZachary Turner break; 63429cb868aSZachary Turner 63529cb868aSZachary Turner case eFormatUnicode32: 63629cb868aSZachary Turner s->Printf("U+0x%8.8x", DE.GetU32(&offset)); 63729cb868aSZachary Turner break; 63829cb868aSZachary Turner 63929cb868aSZachary Turner case eFormatAddressInfo: { 64029cb868aSZachary Turner addr_t addr = DE.GetMaxU64Bitfield(&offset, item_byte_size, item_bit_size, 64129cb868aSZachary Turner item_bit_offset); 64229cb868aSZachary Turner s->Printf("0x%*.*" PRIx64, (int)(2 * item_byte_size), 64329cb868aSZachary Turner (int)(2 * item_byte_size), addr); 64429cb868aSZachary Turner if (exe_scope) { 64529cb868aSZachary Turner TargetSP target_sp(exe_scope->CalculateTarget()); 64629cb868aSZachary Turner lldb_private::Address so_addr; 64729cb868aSZachary Turner if (target_sp) { 64829cb868aSZachary Turner if (target_sp->GetSectionLoadList().ResolveLoadAddress(addr, 64929cb868aSZachary Turner so_addr)) { 65029cb868aSZachary Turner s->PutChar(' '); 65129cb868aSZachary Turner so_addr.Dump(s, exe_scope, Address::DumpStyleResolvedDescription, 65229cb868aSZachary Turner Address::DumpStyleModuleWithFileAddress); 65329cb868aSZachary Turner } else { 65429cb868aSZachary Turner so_addr.SetOffset(addr); 65529cb868aSZachary Turner so_addr.Dump(s, exe_scope, 65629cb868aSZachary Turner Address::DumpStyleResolvedPointerDescription); 65729cb868aSZachary Turner } 65829cb868aSZachary Turner } 65929cb868aSZachary Turner } 66029cb868aSZachary Turner } break; 66129cb868aSZachary Turner 66229cb868aSZachary Turner case eFormatHexFloat: 66329cb868aSZachary Turner if (sizeof(float) == item_byte_size) { 66429cb868aSZachary Turner char float_cstr[256]; 66529cb868aSZachary Turner llvm::APFloat ap_float(DE.GetFloat(&offset)); 66629cb868aSZachary Turner ap_float.convertToHexString(float_cstr, 0, false, 66729cb868aSZachary Turner llvm::APFloat::rmNearestTiesToEven); 66829cb868aSZachary Turner s->Printf("%s", float_cstr); 66929cb868aSZachary Turner break; 67029cb868aSZachary Turner } else if (sizeof(double) == item_byte_size) { 67129cb868aSZachary Turner char float_cstr[256]; 67229cb868aSZachary Turner llvm::APFloat ap_float(DE.GetDouble(&offset)); 67329cb868aSZachary Turner ap_float.convertToHexString(float_cstr, 0, false, 67429cb868aSZachary Turner llvm::APFloat::rmNearestTiesToEven); 67529cb868aSZachary Turner s->Printf("%s", float_cstr); 67629cb868aSZachary Turner break; 67729cb868aSZachary Turner } else { 67829cb868aSZachary Turner s->Printf("error: unsupported byte size (%" PRIu64 67929cb868aSZachary Turner ") for hex float format", 68029cb868aSZachary Turner (uint64_t)item_byte_size); 68129cb868aSZachary Turner return offset; 68229cb868aSZachary Turner } 68329cb868aSZachary Turner break; 68429cb868aSZachary Turner 68529cb868aSZachary Turner // please keep the single-item formats below in sync with 68629cb868aSZachary Turner // FormatManager::GetSingleItemFormat 68729cb868aSZachary Turner // if you fail to do so, users will start getting different outputs 68829cb868aSZachary Turner // depending on internal 68929cb868aSZachary Turner // implementation details they should not care about || 69029cb868aSZachary Turner case eFormatVectorOfChar: // || 69129cb868aSZachary Turner s->PutChar('{'); // \/ 69229cb868aSZachary Turner offset = 69329cb868aSZachary Turner DumpDataExtractor(DE, s, offset, eFormatCharArray, 1, item_byte_size, 69429cb868aSZachary Turner item_byte_size, LLDB_INVALID_ADDRESS, 0, 0); 69529cb868aSZachary Turner s->PutChar('}'); 69629cb868aSZachary Turner break; 69729cb868aSZachary Turner 69829cb868aSZachary Turner case eFormatVectorOfSInt8: 69929cb868aSZachary Turner s->PutChar('{'); 70029cb868aSZachary Turner offset = 70129cb868aSZachary Turner DumpDataExtractor(DE, s, offset, eFormatDecimal, 1, item_byte_size, 70229cb868aSZachary Turner item_byte_size, LLDB_INVALID_ADDRESS, 0, 0); 70329cb868aSZachary Turner s->PutChar('}'); 70429cb868aSZachary Turner break; 70529cb868aSZachary Turner 70629cb868aSZachary Turner case eFormatVectorOfUInt8: 70729cb868aSZachary Turner s->PutChar('{'); 70829cb868aSZachary Turner offset = DumpDataExtractor(DE, s, offset, eFormatHex, 1, item_byte_size, 70929cb868aSZachary Turner item_byte_size, LLDB_INVALID_ADDRESS, 0, 0); 71029cb868aSZachary Turner s->PutChar('}'); 71129cb868aSZachary Turner break; 71229cb868aSZachary Turner 71329cb868aSZachary Turner case eFormatVectorOfSInt16: 71429cb868aSZachary Turner s->PutChar('{'); 71529cb868aSZachary Turner offset = DumpDataExtractor( 71629cb868aSZachary Turner DE, s, offset, eFormatDecimal, sizeof(uint16_t), 71729cb868aSZachary Turner item_byte_size / sizeof(uint16_t), item_byte_size / sizeof(uint16_t), 71829cb868aSZachary Turner LLDB_INVALID_ADDRESS, 0, 0); 71929cb868aSZachary Turner s->PutChar('}'); 72029cb868aSZachary Turner break; 72129cb868aSZachary Turner 72229cb868aSZachary Turner case eFormatVectorOfUInt16: 72329cb868aSZachary Turner s->PutChar('{'); 72429cb868aSZachary Turner offset = DumpDataExtractor(DE, s, offset, eFormatHex, sizeof(uint16_t), 72529cb868aSZachary Turner item_byte_size / sizeof(uint16_t), 72629cb868aSZachary Turner item_byte_size / sizeof(uint16_t), 72729cb868aSZachary Turner LLDB_INVALID_ADDRESS, 0, 0); 72829cb868aSZachary Turner s->PutChar('}'); 72929cb868aSZachary Turner break; 73029cb868aSZachary Turner 73129cb868aSZachary Turner case eFormatVectorOfSInt32: 73229cb868aSZachary Turner s->PutChar('{'); 73329cb868aSZachary Turner offset = DumpDataExtractor( 73429cb868aSZachary Turner DE, s, offset, eFormatDecimal, sizeof(uint32_t), 73529cb868aSZachary Turner item_byte_size / sizeof(uint32_t), item_byte_size / sizeof(uint32_t), 73629cb868aSZachary Turner LLDB_INVALID_ADDRESS, 0, 0); 73729cb868aSZachary Turner s->PutChar('}'); 73829cb868aSZachary Turner break; 73929cb868aSZachary Turner 74029cb868aSZachary Turner case eFormatVectorOfUInt32: 74129cb868aSZachary Turner s->PutChar('{'); 74229cb868aSZachary Turner offset = DumpDataExtractor(DE, s, offset, eFormatHex, sizeof(uint32_t), 74329cb868aSZachary Turner item_byte_size / sizeof(uint32_t), 74429cb868aSZachary Turner item_byte_size / sizeof(uint32_t), 74529cb868aSZachary Turner LLDB_INVALID_ADDRESS, 0, 0); 74629cb868aSZachary Turner s->PutChar('}'); 74729cb868aSZachary Turner break; 74829cb868aSZachary Turner 74929cb868aSZachary Turner case eFormatVectorOfSInt64: 75029cb868aSZachary Turner s->PutChar('{'); 75129cb868aSZachary Turner offset = DumpDataExtractor( 75229cb868aSZachary Turner DE, s, offset, eFormatDecimal, sizeof(uint64_t), 75329cb868aSZachary Turner item_byte_size / sizeof(uint64_t), item_byte_size / sizeof(uint64_t), 75429cb868aSZachary Turner LLDB_INVALID_ADDRESS, 0, 0); 75529cb868aSZachary Turner s->PutChar('}'); 75629cb868aSZachary Turner break; 75729cb868aSZachary Turner 75829cb868aSZachary Turner case eFormatVectorOfUInt64: 75929cb868aSZachary Turner s->PutChar('{'); 76029cb868aSZachary Turner offset = DumpDataExtractor(DE, s, offset, eFormatHex, sizeof(uint64_t), 76129cb868aSZachary Turner item_byte_size / sizeof(uint64_t), 76229cb868aSZachary Turner item_byte_size / sizeof(uint64_t), 76329cb868aSZachary Turner LLDB_INVALID_ADDRESS, 0, 0); 76429cb868aSZachary Turner s->PutChar('}'); 76529cb868aSZachary Turner break; 76629cb868aSZachary Turner 76729cb868aSZachary Turner case eFormatVectorOfFloat16: 76829cb868aSZachary Turner s->PutChar('{'); 76929cb868aSZachary Turner offset = 77029cb868aSZachary Turner DumpDataExtractor(DE, s, offset, eFormatFloat, 2, item_byte_size / 2, 77129cb868aSZachary Turner item_byte_size / 2, LLDB_INVALID_ADDRESS, 0, 0); 77229cb868aSZachary Turner s->PutChar('}'); 77329cb868aSZachary Turner break; 77429cb868aSZachary Turner 77529cb868aSZachary Turner case eFormatVectorOfFloat32: 77629cb868aSZachary Turner s->PutChar('{'); 77729cb868aSZachary Turner offset = 77829cb868aSZachary Turner DumpDataExtractor(DE, s, offset, eFormatFloat, 4, item_byte_size / 4, 77929cb868aSZachary Turner item_byte_size / 4, LLDB_INVALID_ADDRESS, 0, 0); 78029cb868aSZachary Turner s->PutChar('}'); 78129cb868aSZachary Turner break; 78229cb868aSZachary Turner 78329cb868aSZachary Turner case eFormatVectorOfFloat64: 78429cb868aSZachary Turner s->PutChar('{'); 78529cb868aSZachary Turner offset = 78629cb868aSZachary Turner DumpDataExtractor(DE, s, offset, eFormatFloat, 8, item_byte_size / 8, 78729cb868aSZachary Turner item_byte_size / 8, LLDB_INVALID_ADDRESS, 0, 0); 78829cb868aSZachary Turner s->PutChar('}'); 78929cb868aSZachary Turner break; 79029cb868aSZachary Turner 79129cb868aSZachary Turner case eFormatVectorOfUInt128: 79229cb868aSZachary Turner s->PutChar('{'); 79329cb868aSZachary Turner offset = 79429cb868aSZachary Turner DumpDataExtractor(DE, s, offset, eFormatHex, 16, item_byte_size / 16, 79529cb868aSZachary Turner item_byte_size / 16, LLDB_INVALID_ADDRESS, 0, 0); 79629cb868aSZachary Turner s->PutChar('}'); 79729cb868aSZachary Turner break; 79829cb868aSZachary Turner } 79929cb868aSZachary Turner } 80029cb868aSZachary Turner 80129cb868aSZachary Turner if (item_format == eFormatBytesWithASCII && offset > line_start_offset) { 80229cb868aSZachary Turner s->Printf("%*s", static_cast<int>( 80329cb868aSZachary Turner (num_per_line - (offset - line_start_offset)) * 3 + 2), 80429cb868aSZachary Turner ""); 80529cb868aSZachary Turner DumpDataExtractor(DE, s, line_start_offset, eFormatCharPrintable, 1, 80629cb868aSZachary Turner offset - line_start_offset, SIZE_MAX, 80729cb868aSZachary Turner LLDB_INVALID_ADDRESS, 0, 0); 80829cb868aSZachary Turner } 80929cb868aSZachary Turner return offset; // Return the offset at which we ended up 81029cb868aSZachary Turner } 8119739a552SZachary Turner 8129739a552SZachary Turner void lldb_private::DumpHexBytes(Stream *s, const void *src, size_t src_len, 8139739a552SZachary Turner uint32_t bytes_per_line, 8149739a552SZachary Turner lldb::addr_t base_addr) { 8159739a552SZachary Turner DataExtractor data(src, src_len, lldb::eByteOrderLittle, 4); 8169739a552SZachary Turner DumpDataExtractor(data, s, 8179739a552SZachary Turner 0, // Offset into "src" 8189739a552SZachary Turner lldb::eFormatBytes, // Dump as hex bytes 8199739a552SZachary Turner 1, // Size of each item is 1 for single bytes 8209739a552SZachary Turner src_len, // Number of bytes 8219739a552SZachary Turner bytes_per_line, // Num bytes per line 8229739a552SZachary Turner base_addr, // Base address 8239739a552SZachary Turner 0, 0); // Bitfield info 8249739a552SZachary Turner } 825