1 //===-- DNBDataRef.h --------------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Created by Greg Clayton on 1/11/06. 10 // 11 //===----------------------------------------------------------------------===// 12 // 13 // DNBDataRef is a class that can extract data in normal or byte 14 // swapped order from a data buffer that someone else owns. The data 15 // buffer needs to remain intact as long as the DNBDataRef object 16 // needs the data. Strings returned are pointers into the data buffer 17 // and will need to be copied if they are needed after the data buffer 18 // is no longer around. 19 // 20 //===----------------------------------------------------------------------===// 21 22 #ifndef LLDB_TOOLS_DEBUGSERVER_SOURCE_DNBDATAREF_H 23 #define LLDB_TOOLS_DEBUGSERVER_SOURCE_DNBDATAREF_H 24 25 #include "DNBDefs.h" 26 #include <limits.h> 27 #include <stdint.h> 28 #include <stdio.h> 29 #include <string.h> 30 31 class DNBDataRef { 32 public: 33 // For use with Dump 34 enum Type { 35 TypeUInt8 = 0, 36 TypeChar, 37 TypeUInt16, 38 TypeUInt32, 39 TypeUInt64, 40 TypePointer, 41 TypeULEB128, 42 TypeSLEB128 43 }; 44 typedef uint32_t offset_t; 45 typedef nub_addr_t addr_t; 46 47 DNBDataRef(); 48 DNBDataRef(const uint8_t *start, size_t size, bool swap); 49 ~DNBDataRef(); Clear()50 void Clear() { 51 DNBDataRef::SetData(NULL, 0); 52 m_swap = false; 53 } 54 BytesLeft(size_t offset)55 size_t BytesLeft(size_t offset) const { 56 const size_t size = GetSize(); 57 if (size > offset) 58 return size - offset; 59 return 0; 60 } 61 ValidOffset(offset_t offset)62 bool ValidOffset(offset_t offset) const { return BytesLeft(offset) > 0; } ValidOffsetForDataOfSize(offset_t offset,uint32_t num_bytes)63 bool ValidOffsetForDataOfSize(offset_t offset, uint32_t num_bytes) const { 64 return num_bytes <= BytesLeft(offset); 65 } GetSize()66 size_t GetSize() const { return m_end - m_start; } GetDataStart()67 const uint8_t *GetDataStart() const { return m_start; } GetDataEnd()68 const uint8_t *GetDataEnd() const { return m_end; } GetSwap()69 bool GetSwap() const { return m_swap; } SetSwap(bool swap)70 void SetSwap(bool swap) { m_swap = swap; } SetData(const uint8_t * start,size_t size)71 void SetData(const uint8_t *start, size_t size) { 72 m_start = start; 73 if (m_start != NULL) 74 m_end = start + size; 75 else 76 m_end = NULL; 77 } GetPointerSize()78 uint8_t GetPointerSize() const { return m_ptrSize; } SetPointerSize(uint8_t size)79 void SetPointerSize(uint8_t size) { m_ptrSize = size; } 80 void SetEHPtrBaseAddrPCRelative(addr_t addr = INVALID_NUB_ADDRESS) { 81 m_addrPCRelative = addr; 82 } 83 void SetEHPtrBaseAddrTEXT(addr_t addr = INVALID_NUB_ADDRESS) { 84 m_addrTEXT = addr; 85 } 86 void SetEHPtrBaseAddrDATA(addr_t addr = INVALID_NUB_ADDRESS) { 87 m_addrDATA = addr; 88 } 89 uint8_t Get8(offset_t *offset_ptr) const; 90 uint16_t Get16(offset_t *offset_ptr) const; 91 uint32_t Get32(offset_t *offset_ptr) const; 92 uint64_t Get64(offset_t *offset_ptr) const; 93 uint32_t GetMax32(offset_t *offset_ptr, uint32_t byte_size) const; 94 uint64_t GetMax64(offset_t *offset_ptr, uint32_t byte_size) const; 95 uint64_t GetPointer(offset_t *offset_ptr) const; 96 // uint64_t GetDwarfEHPtr(offset_t *offset_ptr, uint32_t eh_ptr_enc) 97 // const; 98 const char *GetCStr(offset_t *offset_ptr, uint32_t fixed_length = 0) const; PeekCStr(offset_t offset)99 const char *PeekCStr(offset_t offset) const { 100 if (ValidOffset(offset)) 101 return (const char *)m_start + offset; 102 return NULL; 103 } 104 105 const uint8_t *GetData(offset_t *offset_ptr, uint32_t length) const; 106 uint64_t Get_ULEB128(offset_t *offset_ptr) const; 107 int64_t Get_SLEB128(offset_t *offset_ptr) const; 108 void Skip_LEB128(offset_t *offset_ptr) const; 109 110 uint32_t Dump(offset_t startOffset, offset_t endOffset, uint64_t offsetBase, 111 DNBDataRef::Type type, uint32_t numPerLine, 112 const char *typeFormat = NULL); 113 114 protected: 115 const uint8_t *m_start; 116 const uint8_t *m_end; 117 bool m_swap; 118 uint8_t m_ptrSize; 119 addr_t m_addrPCRelative; 120 addr_t m_addrTEXT; 121 addr_t m_addrDATA; 122 }; 123 124 #endif // LLDB_TOOLS_DEBUGSERVER_SOURCE_DNBDATAREF_H 125