124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DNBDataRef.h --------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Created by Greg Clayton on 1/11/06. 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// DNBDataRef is a class that can extract data in normal or byte 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// swapped order from a data buffer that someone else owns. The data 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// buffer needs to remain intact as long as the DNBDataRef object 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// needs the data. Strings returned are pointers into the data buffer 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and will need to be copied if they are needed after the data buffer 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// is no longer around. 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef __DNBDataRef_h__ 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define __DNBDataRef_h__ 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DNBDefs.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdint.h> 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdio.h> 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string.h> 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <limits.h> 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DNBDataRef 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // For use with Dump 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef enum 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeUInt8 = 0, 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeChar, 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeUInt16, 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeUInt32, 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeUInt64, 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypePointer, 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeULEB128, 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeSLEB128 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } Type; 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef uint32_t offset_t; 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef nub_addr_t addr_t; 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DNBDataRef(); 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DNBDataRef(const uint8_t *start, size_t size, bool swap); 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~DNBDataRef(); 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void Clear() 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DNBDataRef::SetData(NULL, 0); 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_swap = false; 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 593c6f51715ac410086b872649b22940262a368d5cGreg Clayton offset_t BytesLeft (offset_t offset) const 603c6f51715ac410086b872649b22940262a368d5cGreg Clayton { 613c6f51715ac410086b872649b22940262a368d5cGreg Clayton const offset_t size = GetSize(); 623c6f51715ac410086b872649b22940262a368d5cGreg Clayton if (size > offset) 633c6f51715ac410086b872649b22940262a368d5cGreg Clayton return size - offset; 643c6f51715ac410086b872649b22940262a368d5cGreg Clayton return 0; 653c6f51715ac410086b872649b22940262a368d5cGreg Clayton } 663c6f51715ac410086b872649b22940262a368d5cGreg Clayton 673c6f51715ac410086b872649b22940262a368d5cGreg Clayton bool ValidOffset(offset_t offset) const 683c6f51715ac410086b872649b22940262a368d5cGreg Clayton { 693c6f51715ac410086b872649b22940262a368d5cGreg Clayton return BytesLeft(offset) > 0; 703c6f51715ac410086b872649b22940262a368d5cGreg Clayton } 713c6f51715ac410086b872649b22940262a368d5cGreg Clayton bool ValidOffsetForDataOfSize(offset_t offset, uint32_t num_bytes) const 723c6f51715ac410086b872649b22940262a368d5cGreg Clayton { 733c6f51715ac410086b872649b22940262a368d5cGreg Clayton return num_bytes <= BytesLeft (offset); 743c6f51715ac410086b872649b22940262a368d5cGreg Clayton } 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t GetSize() const { return m_end - m_start; } 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * GetDataStart() const { return m_start; } 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * GetDataEnd() const { return m_end; } 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool GetSwap() const { return m_swap; } 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void SetSwap(bool swap) { m_swap = swap; } 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void SetData(const uint8_t *start, size_t size) 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_start = start; 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_start != NULL) 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_end = start + size; 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_end = NULL; 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t GetPointerSize() const { return m_ptrSize; } 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void SetPointerSize(uint8_t size) { m_ptrSize = size; } 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void SetEHPtrBaseAddrPCRelative(addr_t addr = INVALID_NUB_ADDRESS) { m_addrPCRelative = addr; } 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void SetEHPtrBaseAddrTEXT(addr_t addr = INVALID_NUB_ADDRESS) { m_addrTEXT = addr; } 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void SetEHPtrBaseAddrDATA(addr_t addr = INVALID_NUB_ADDRESS) { m_addrDATA = addr; } 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t Get8(offset_t *offset_ptr) const; 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint16_t Get16(offset_t *offset_ptr) const; 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t Get32(offset_t *offset_ptr) const; 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t Get64(offset_t *offset_ptr) const; 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t GetMax32(offset_t *offset_ptr, uint32_t byte_size) const; 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t GetMax64(offset_t *offset_ptr, uint32_t byte_size) const; 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t GetPointer(offset_t *offset_ptr) const; 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint64_t GetDwarfEHPtr(offset_t *offset_ptr, uint32_t eh_ptr_enc) const; 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char * GetCStr(offset_t *offset_ptr, uint32_t fixed_length = 0) const; 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char * PeekCStr(offset_t offset) const 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ValidOffset(offset)) 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return (const char*)m_start + offset; 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * GetData( offset_t *offset_ptr, uint32_t length) const; 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t Get_ULEB128 (offset_t *offset_ptr) const; 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t Get_SLEB128 (offset_t *offset_ptr) const; 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void Skip_LEB128 (offset_t *offset_ptr) const; 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t Dump(offset_t startOffset, offset_t endOffset, uint64_t offsetBase, DNBDataRef::Type type, uint32_t numPerLine, const char *typeFormat = NULL); 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * m_start; 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * m_end; 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool m_swap; 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t m_ptrSize; 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t m_addrPCRelative; 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t m_addrTEXT; 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t m_addrDATA; 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // #ifndef __DNBDataRef_h__ 126