124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DWARFDebugPubnamesSet.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
10d996d0c32b483c2190e1eb288cd3bbbd259c2960Greg Clayton#ifndef SymbolFileDWARF_DWARFDebugPubnamesSet_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define SymbolFileDWARF_DWARFDebugPubnamesSet_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "SymbolFileDWARF.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string>
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
1691815a4770797a42816c4219d40b9f6148c03646Sean Callanan#if __cplusplus >= 201103L
1791815a4770797a42816c4219d40b9f6148c03646Sean Callanan#include <unordered_map>
1891815a4770797a42816c4219d40b9f6148c03646Sean Callanan#else
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <ext/hash_map>
2091815a4770797a42816c4219d40b9f6148c03646Sean Callanan#endif
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFDebugPubnamesSet
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct Header
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t    length;     // length of the set of entries for this compilation unit, not including the length field itself
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint16_t    version;    // The DWARF version number
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t    die_offset; // compile unit .debug_info offset
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t    die_length; // compile unit .debug_info length
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Header() :
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            length(10),
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            version(2),
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            die_offset(DW_INVALID_OFFSET),
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            die_length(0)
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct Descriptor
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Descriptor() :
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            offset(),
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            name()
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Descriptor(dw_offset_t the_offset, const char *the_name) :
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            offset(the_offset),
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            name(the_name ? the_name : "")
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        dw_offset_t offset;
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::string name;
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                DWARFDebugPubnamesSet();
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                DWARFDebugPubnamesSet(dw_offset_t debug_aranges_offset, dw_offset_t cu_die_offset, dw_offset_t die_length);
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    dw_offset_t GetOffset() const { return m_offset; }
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void        SetOffset(dw_offset_t offset) { m_offset = offset; }
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFDebugPubnamesSet::Header& GetHeader() { return m_header; }
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const DWARFDebugPubnamesSet::Header& GetHeader() const { return m_header; }
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const DWARFDebugPubnamesSet::Descriptor* GetDescriptor(uint32_t i) const
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (i < m_descriptors.size())
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return &m_descriptors[i];
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return NULL;
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t    NumDescriptors() const { return m_descriptors.size(); }
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void        AddDescriptor(dw_offset_t cu_rel_offset, const char* name);
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void        Clear();
7336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    bool        Extract(const lldb_private::DataExtractor& debug_pubnames_data, lldb::offset_t *offset_ptr);
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void        Dump(lldb_private::Log *s) const;
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void        InitNameIndexes() const;
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void        Find(const char* name, bool ignore_case, std::vector<dw_offset_t>& die_offset_coll) const;
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void        Find(const lldb_private::RegularExpression& regex, std::vector<dw_offset_t>& die_offsets) const;
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    dw_offset_t GetOffsetOfNextEntry() const;
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::vector<Descriptor>         DescriptorColl;
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef DescriptorColl::iterator        DescriptorIter;
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef DescriptorColl::const_iterator  DescriptorConstIter;
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    dw_offset_t     m_offset;
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Header          m_header;
9091815a4770797a42816c4219d40b9f6148c03646Sean Callanan#if __cplusplus >= 201103L
9191815a4770797a42816c4219d40b9f6148c03646Sean Callanan    typedef std::unordered_multimap<const char*, uint32_t, std::hash<const char*>, CStringEqualBinaryPredicate> cstr_to_index_mmap;
9291815a4770797a42816c4219d40b9f6148c03646Sean Callanan#else
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef __gnu_cxx::hash_multimap<const char*, uint32_t, __gnu_cxx::hash<const char*>, CStringEqualBinaryPredicate> cstr_to_index_mmap;
9491815a4770797a42816c4219d40b9f6148c03646Sean Callanan#endif
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DescriptorColl  m_descriptors;
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    mutable cstr_to_index_mmap m_name_to_descriptor_index;
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // SymbolFileDWARF_DWARFDebugPubnamesSet_h_
100