124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DWARFDebugPubnamesSet.cpp -------------------------------*- 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#include "DWARFDebugPubnamesSet.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "SymbolFileDWARF.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::DWARFDebugPubnamesSet() :
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_offset(DW_INVALID_OFFSET),
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_header(),
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_descriptors(),
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name_to_descriptor_index()
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::DWARFDebugPubnamesSet(dw_offset_t debug_aranges_offset, dw_offset_t cu_die_offset, dw_offset_t cu_die_length) :
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_offset(debug_aranges_offset),
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_header(),
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_descriptors(),
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name_to_descriptor_index()
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_header.length = 10;               // set the length to only include the header right for now
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_header.version = 2;               // The DWARF version number
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_header.die_offset = cu_die_offset;// compile unit .debug_info offset
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_header.die_length = cu_die_length;// compile unit .debug_info length
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::AddDescriptor(dw_offset_t cu_rel_offset, const char* name)
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name && name[0])
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Adjust our header length
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_header.length += strlen(name) + 1 + sizeof(dw_offset_t);
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Descriptor pubnameDesc(cu_rel_offset, name);
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_descriptors.push_back(pubnameDesc);
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::Clear()
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_offset = DW_INVALID_OFFSET;
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_header.length = 10;
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_header.version = 2;
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_header.die_offset = DW_INVALID_OFFSET;
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_header.die_length = 0;
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_descriptors.clear();
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// InitNameIndexes
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::InitNameIndexes() const
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Create the name index vector to be able to quickly search by name
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t count = m_descriptors.size();
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (uint32_t idx = 0; idx < count; ++idx)
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const char* name = m_descriptors[idx].name.c_str();
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (name && name[0])
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_name_to_descriptor_index.insert(cstr_to_index_mmap::value_type(name, idx));
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
8136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonDWARFDebugPubnamesSet::Extract(const DataExtractor& data, lldb::offset_t *offset_ptr)
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (data.ValidOffset(*offset_ptr))
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_descriptors.clear();
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_offset = *offset_ptr;
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_header.length     = data.GetU32(offset_ptr);
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_header.version    = data.GetU16(offset_ptr);
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_header.die_offset = data.GetU32(offset_ptr);
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_header.die_length = data.GetU32(offset_ptr);
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Descriptor pubnameDesc;
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        while (data.ValidOffset(*offset_ptr))
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            pubnameDesc.offset  = data.GetU32(offset_ptr);
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (pubnameDesc.offset)
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const char* name = data.GetCStr(offset_ptr);
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (name && name[0])
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    pubnameDesc.name = name;
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_descriptors.push_back(pubnameDesc);
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;  // We are done if we get a zero 4 byte offset
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return !m_descriptors.empty();
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerdw_offset_t
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::GetOffsetOfNextEntry() const
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_offset + m_header.length + 4;
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::Dump(Log *log) const
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    log->Printf("Pubnames Header: length = 0x%8.8x, version = 0x%4.4x, die_offset = 0x%8.8x, die_length = 0x%8.8x",
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_header.length,
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_header.version,
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_header.die_offset,
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_header.die_length);
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool verbose = log->GetVerbose();
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DescriptorConstIter pos;
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DescriptorConstIter end = m_descriptors.end();
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = m_descriptors.begin(); pos != end; ++pos)
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (verbose)
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf("0x%8.8x + 0x%8.8x = 0x%8.8x: %s", pos->offset, m_header.die_offset, pos->offset + m_header.die_offset, pos->name.c_str());
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf("0x%8.8x: %s", pos->offset + m_header.die_offset, pos->name.c_str());
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::Find(const char* name, bool ignore_case, std::vector<dw_offset_t>& die_offset_coll) const
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!m_descriptors.empty() && m_name_to_descriptor_index.empty())
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        InitNameIndexes();
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::pair<cstr_to_index_mmap::const_iterator, cstr_to_index_mmap::const_iterator> range(m_name_to_descriptor_index.equal_range(name));
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (cstr_to_index_mmap::const_iterator pos = range.first; pos != range.second; ++pos)
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        die_offset_coll.push_back(m_header.die_offset + m_descriptors[(*pos).second].offset);
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnamesSet::Find(const RegularExpression& regex, std::vector<dw_offset_t>& die_offset_coll) const
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DescriptorConstIter pos;
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DescriptorConstIter end = m_descriptors.end();
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = m_descriptors.begin(); pos != end; ++pos)
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if ( regex.Execute(pos->name.c_str()) )
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            die_offset_coll.push_back(m_header.die_offset + pos->offset);
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
167