1 //===-- DNBDataRef.h --------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // Created by Greg Clayton on 1/11/06.
12 //===----------------------------------------------------------------------===//
14 // DNBDataRef is a class that can extract data in normal or byte
15 // swapped order from a data buffer that someone else owns. The data
16 // buffer needs to remain intact as long as the DNBDataRef object
17 // needs the data. Strings returned are pointers into the data buffer
18 // and will need to be copied if they are needed after the data buffer
19 // is no longer around.
21 //===----------------------------------------------------------------------===//
23 #ifndef __DNBDataRef_h__
24 #define __DNBDataRef_h__
47 typedef uint32_t offset_t;
48 typedef nub_addr_t addr_t;
51 DNBDataRef(const uint8_t *start, size_t size, bool swap);
55 DNBDataRef::SetData(NULL, 0);
59 size_t BytesLeft (size_t offset) const
61 const size_t size = GetSize();
67 bool ValidOffset(offset_t offset) const
69 return BytesLeft(offset) > 0;
71 bool ValidOffsetForDataOfSize(offset_t offset, uint32_t num_bytes) const
73 return num_bytes <= BytesLeft (offset);
75 size_t GetSize() const { return m_end - m_start; }
76 const uint8_t * GetDataStart() const { return m_start; }
77 const uint8_t * GetDataEnd() const { return m_end; }
78 bool GetSwap() const { return m_swap; }
79 void SetSwap(bool swap) { m_swap = swap; }
80 void SetData(const uint8_t *start, size_t size)
88 uint8_t GetPointerSize() const { return m_ptrSize; }
89 void SetPointerSize(uint8_t size) { m_ptrSize = size; }
90 void SetEHPtrBaseAddrPCRelative(addr_t addr = INVALID_NUB_ADDRESS) { m_addrPCRelative = addr; }
91 void SetEHPtrBaseAddrTEXT(addr_t addr = INVALID_NUB_ADDRESS) { m_addrTEXT = addr; }
92 void SetEHPtrBaseAddrDATA(addr_t addr = INVALID_NUB_ADDRESS) { m_addrDATA = addr; }
93 uint8_t Get8(offset_t *offset_ptr) const;
94 uint16_t Get16(offset_t *offset_ptr) const;
95 uint32_t Get32(offset_t *offset_ptr) const;
96 uint64_t Get64(offset_t *offset_ptr) const;
97 uint32_t GetMax32(offset_t *offset_ptr, uint32_t byte_size) const;
98 uint64_t GetMax64(offset_t *offset_ptr, uint32_t byte_size) const;
99 uint64_t GetPointer(offset_t *offset_ptr) const;
100 // uint64_t GetDwarfEHPtr(offset_t *offset_ptr, uint32_t eh_ptr_enc) const;
101 const char * GetCStr(offset_t *offset_ptr, uint32_t fixed_length = 0) const;
102 const char * PeekCStr(offset_t offset) const
104 if (ValidOffset(offset))
105 return (const char*)m_start + offset;
109 const uint8_t * GetData( offset_t *offset_ptr, uint32_t length) const;
110 uint64_t Get_ULEB128 (offset_t *offset_ptr) const;
111 int64_t Get_SLEB128 (offset_t *offset_ptr) const;
112 void Skip_LEB128 (offset_t *offset_ptr) const;
114 uint32_t Dump(offset_t startOffset, offset_t endOffset, uint64_t offsetBase, DNBDataRef::Type type, uint32_t numPerLine, const char *typeFormat = NULL);
116 const uint8_t * m_start;
117 const uint8_t * m_end;
120 addr_t m_addrPCRelative;
125 #endif // #ifndef __DNBDataRef_h__