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