| //===-- DNBDataRef.h --------------------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // Created by Greg Clayton on 1/11/06. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // DNBDataRef is a class that can extract data in normal or byte |
| // swapped order from a data buffer that someone else owns. The data |
| // buffer needs to remain intact as long as the DNBDataRef object |
| // needs the data. Strings returned are pointers into the data buffer |
| // and will need to be copied if they are needed after the data buffer |
| // is no longer around. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef __DNBDataRef_h__ |
| #define __DNBDataRef_h__ |
| |
| #include "DNBDefs.h" |
| #include <limits.h> |
| #include <stdint.h> |
| #include <stdio.h> |
| #include <string.h> |
| |
| class DNBDataRef { |
| public: |
| // For use with Dump |
| typedef enum { |
| TypeUInt8 = 0, |
| TypeChar, |
| TypeUInt16, |
| TypeUInt32, |
| TypeUInt64, |
| TypePointer, |
| TypeULEB128, |
| TypeSLEB128 |
| } Type; |
| typedef uint32_t offset_t; |
| typedef nub_addr_t addr_t; |
| |
| DNBDataRef(); |
| DNBDataRef(const uint8_t *start, size_t size, bool swap); |
| ~DNBDataRef(); |
| void Clear() { |
| DNBDataRef::SetData(NULL, 0); |
| m_swap = false; |
| } |
| |
| size_t BytesLeft(size_t offset) const { |
| const size_t size = GetSize(); |
| if (size > offset) |
| return size - offset; |
| return 0; |
| } |
| |
| bool ValidOffset(offset_t offset) const { return BytesLeft(offset) > 0; } |
| bool ValidOffsetForDataOfSize(offset_t offset, uint32_t num_bytes) const { |
| return num_bytes <= BytesLeft(offset); |
| } |
| size_t GetSize() const { return m_end - m_start; } |
| const uint8_t *GetDataStart() const { return m_start; } |
| const uint8_t *GetDataEnd() const { return m_end; } |
| bool GetSwap() const { return m_swap; } |
| void SetSwap(bool swap) { m_swap = swap; } |
| void SetData(const uint8_t *start, size_t size) { |
| m_start = start; |
| if (m_start != NULL) |
| m_end = start + size; |
| else |
| m_end = NULL; |
| } |
| uint8_t GetPointerSize() const { return m_ptrSize; } |
| void SetPointerSize(uint8_t size) { m_ptrSize = size; } |
| void SetEHPtrBaseAddrPCRelative(addr_t addr = INVALID_NUB_ADDRESS) { |
| m_addrPCRelative = addr; |
| } |
| void SetEHPtrBaseAddrTEXT(addr_t addr = INVALID_NUB_ADDRESS) { |
| m_addrTEXT = addr; |
| } |
| void SetEHPtrBaseAddrDATA(addr_t addr = INVALID_NUB_ADDRESS) { |
| m_addrDATA = addr; |
| } |
| uint8_t Get8(offset_t *offset_ptr) const; |
| uint16_t Get16(offset_t *offset_ptr) const; |
| uint32_t Get32(offset_t *offset_ptr) const; |
| uint64_t Get64(offset_t *offset_ptr) const; |
| uint32_t GetMax32(offset_t *offset_ptr, uint32_t byte_size) const; |
| uint64_t GetMax64(offset_t *offset_ptr, uint32_t byte_size) const; |
| uint64_t GetPointer(offset_t *offset_ptr) const; |
| // uint64_t GetDwarfEHPtr(offset_t *offset_ptr, uint32_t eh_ptr_enc) |
| // const; |
| const char *GetCStr(offset_t *offset_ptr, uint32_t fixed_length = 0) const; |
| const char *PeekCStr(offset_t offset) const { |
| if (ValidOffset(offset)) |
| return (const char *)m_start + offset; |
| return NULL; |
| } |
| |
| const uint8_t *GetData(offset_t *offset_ptr, uint32_t length) const; |
| uint64_t Get_ULEB128(offset_t *offset_ptr) const; |
| int64_t Get_SLEB128(offset_t *offset_ptr) const; |
| void Skip_LEB128(offset_t *offset_ptr) const; |
| |
| uint32_t Dump(offset_t startOffset, offset_t endOffset, uint64_t offsetBase, |
| DNBDataRef::Type type, uint32_t numPerLine, |
| const char *typeFormat = NULL); |
| |
| protected: |
| const uint8_t *m_start; |
| const uint8_t *m_end; |
| bool m_swap; |
| uint8_t m_ptrSize; |
| addr_t m_addrPCRelative; |
| addr_t m_addrTEXT; |
| addr_t m_addrDATA; |
| }; |
| |
| #endif // #ifndef __DNBDataRef_h__ |