| 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 <climits> |
| 27 | #include <cstdint> |
| 28 | #include <cstdio> |
| 29 | #include <cstring> |
| 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(); |
| 50 | void Clear() { |
| 51 | DNBDataRef::SetData(NULL, size: 0); |
| 52 | m_swap = false; |
| 53 | } |
| 54 | |
| 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 | |
| 62 | bool ValidOffset(offset_t offset) const { return BytesLeft(offset) > 0; } |
| 63 | bool ValidOffsetForDataOfSize(offset_t offset, uint32_t num_bytes) const { |
| 64 | return num_bytes <= BytesLeft(offset); |
| 65 | } |
| 66 | size_t GetSize() const { return m_end - m_start; } |
| 67 | const uint8_t *GetDataStart() const { return m_start; } |
| 68 | const uint8_t *GetDataEnd() const { return m_end; } |
| 69 | bool GetSwap() const { return m_swap; } |
| 70 | void SetSwap(bool swap) { m_swap = swap; } |
| 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 | } |
| 78 | uint8_t GetPointerSize() const { return m_ptrSize; } |
| 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; |
| 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 | |