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();
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