124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DWARFDebugPubnames.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 "DWARFDebugPubnames.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDebugInfo.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDIECollection.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFFormValue.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFCompileUnit.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "LogChannelDWARF.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "SymbolFileDWARF.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Claytonusing namespace lldb;
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnames::DWARFDebugPubnames() :
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_sets()
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnames::Extract(const DataExtractor& data)
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__,
355f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                        "DWARFDebugPubnames::Extract (byte_size = %" PRIu64 ")",
36851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton                        (uint64_t)data.GetByteSize());
37952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_PUBNAMES));
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
395f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf("DWARFDebugPubnames::Extract (byte_size = %" PRIu64 ")", (uint64_t)data.GetByteSize());
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (data.ValidOffset(0))
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t offset = 0;
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DWARFDebugPubnamesSet set;
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        while (data.ValidOffset(offset))
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (set.Extract(data, &offset))
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_sets.push_back(set);
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                offset = set.GetOffsetOfNextEntry();
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (log)
57952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton            Dump (log);
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnames::GeneratePubnames(SymbolFileDWARF* dwarf2Data)
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__,
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        "DWARFDebugPubnames::GeneratePubnames (data = %p)",
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        dwarf2Data);
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_PUBNAMES));
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf("DWARFDebugPubnames::GeneratePubnames (data = %p)", dwarf2Data);
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_sets.clear();
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFDebugInfo* debug_info = dwarf2Data->DebugInfo();
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (debug_info)
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const DataExtractor* debug_str = &dwarf2Data->get_debug_str_data();
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t cu_idx = 0;
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const uint32_t num_compile_units = dwarf2Data->GetNumCompileUnits();
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DWARFCompileUnit* cu = debug_info->GetCompileUnitAtIndex(cu_idx);
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
895fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton            const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (cu->GetAddressByteSize());
905fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bool clear_dies = cu->ExtractDIEsIfNeeded (false) > 1;
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DWARFDIECollection dies;
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const size_t die_count = cu->AppendDIEsWithTag (DW_TAG_subprogram, dies) +
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                     cu->AppendDIEsWithTag (DW_TAG_variable, dies);
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            dw_offset_t cu_offset = cu->GetOffset();
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DWARFDebugPubnamesSet pubnames_set(DW_INVALID_OFFSET, cu_offset, cu->GetNextCompileUnitOffset() - cu_offset);
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            size_t die_idx;
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (die_idx = 0; die_idx < die_count; ++die_idx)
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const DWARFDebugInfoEntry *die = dies.GetDIEPtrAtIndex(die_idx);
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                DWARFDebugInfoEntry::Attributes attributes;
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const char *name = NULL;
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const char *mangled = NULL;
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bool add_die = false;
1085fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton                const size_t num_attributes = die->GetAttributes(dwarf2Data, cu, fixed_form_sizes, attributes);
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (num_attributes > 0)
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    uint32_t i;
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    dw_tag_t tag = die->Tag();
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (i=0; i<num_attributes; ++i)
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        dw_attr_t attr = attributes.AttributeAtIndex(i);
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        DWARFFormValue form_value;
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        switch (attr)
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case DW_AT_name:
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (attributes.ExtractFormValueAtIndex(dwarf2Data, i, form_value))
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                name = form_value.AsCString(debug_str);
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case DW_AT_MIPS_linkage_name:
1276f3a711edcfaeca1efbb998cdea5d0a0782ddfa3Greg Clayton                        case DW_AT_linkage_name:
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (attributes.ExtractFormValueAtIndex(dwarf2Data, i, form_value))
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                mangled = form_value.AsCString(debug_str);
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case DW_AT_low_pc:
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case DW_AT_ranges:
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case DW_AT_entry_pc:
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (tag == DW_TAG_subprogram)
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                add_die = true;
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case DW_AT_location:
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (tag == DW_TAG_variable)
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                const DWARFDebugInfoEntry* parent_die = die->GetParent();
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                while ( parent_die != NULL )
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    switch (parent_die->Tag())
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    {
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    case DW_TAG_subprogram:
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    case DW_TAG_lexical_block:
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    case DW_TAG_inlined_subroutine:
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // Even if this is a function level static, we don't add it. We could theoretically
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // add these if we wanted to by introspecting into the DW_AT_location and seeing
1525d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton                                        // if the location describes a hard coded address, but we don't want the performance
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // penalty of that right now.
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        add_die = false;
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                      if (attributes.ExtractFormValueAtIndex(dwarf2Data, i, form_value))
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                      {
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                          // If we have valid block data, then we have location expression bytes
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                          // that are fixed (not a location list).
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                          const uint8_t *block_data = form_value.BlockData();
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                          if (block_data)
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                          {
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                              uint32_t block_length = form_value.Unsigned();
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                              if (block_length == 1 + attributes.CompileUnitAtIndex(i)->GetAddressByteSize())
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                              {
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                  if (block_data[0] == DW_OP_addr)
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                      add_die = true;
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                              }
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                          }
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                      }
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        parent_die = NULL;  // Terminate the while loop.
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        break;
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    case DW_TAG_compile_unit:
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        add_die = true;
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        parent_die = NULL;  // Terminate the while loop.
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        break;
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    default:
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        parent_die = parent_die->GetParent();   // Keep going in the while loop.
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        break;
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    }
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (add_die && (name || mangled))
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    pubnames_set.AddDescriptor(die->GetOffset() - cu_offset, mangled ? mangled : name);
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (pubnames_set.NumDescriptors() > 0)
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_sets.push_back(pubnames_set);
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Keep memory down by clearing DIEs if this generate function
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // caused them to be parsed
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (clear_dies)
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                cu->ClearDIEs (true);
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_sets.empty())
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
209952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        Dump (log);
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnames::GeneratePubBaseTypes(SymbolFileDWARF* dwarf2Data)
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_sets.clear();
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFDebugInfo* debug_info = dwarf2Data->DebugInfo();
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (debug_info)
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t cu_idx = 0;
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const uint32_t num_compile_units = dwarf2Data->GetNumCompileUnits();
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DWARFCompileUnit* cu = debug_info->GetCompileUnitAtIndex(cu_idx);
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DWARFDIECollection dies;
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const size_t die_count = cu->AppendDIEsWithTag (DW_TAG_base_type, dies);
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            dw_offset_t cu_offset = cu->GetOffset();
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DWARFDebugPubnamesSet pubnames_set(DW_INVALID_OFFSET, cu_offset, cu->GetNextCompileUnitOffset() - cu_offset);
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            size_t die_idx;
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (die_idx = 0; die_idx < die_count; ++die_idx)
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const DWARFDebugInfoEntry *die = dies.GetDIEPtrAtIndex(die_idx);
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const char *name = die->GetAttributeValueAsString(dwarf2Data, cu, DW_AT_name, NULL);
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (name)
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    pubnames_set.AddDescriptor(die->GetOffset() - cu_offset, name);
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (pubnames_set.NumDescriptors() > 0)
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_sets.push_back(pubnames_set);
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return !m_sets.empty();
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnames::Dump(Log *s) const
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_sets.empty())
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->PutCString("< EMPTY >\n");
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const_iterator pos;
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const_iterator end = m_sets.end();
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (pos = m_sets.begin(); pos != end; ++pos)
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            (*pos).Dump(s);
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnames::Find(const char* name, bool ignore_case, std::vector<dw_offset_t>& die_offsets) const
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const_iterator pos;
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const_iterator end = m_sets.end();
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    die_offsets.clear();
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = m_sets.begin(); pos != end; ++pos)
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        (*pos).Find(name, ignore_case, die_offsets);
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return !die_offsets.empty();
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugPubnames::Find(const RegularExpression& regex, std::vector<dw_offset_t>& die_offsets) const
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const_iterator pos;
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const_iterator end = m_sets.end();
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    die_offsets.clear();
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = m_sets.begin(); pos != end; ++pos)
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        (*pos).Find(regex, die_offsets);
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return !die_offsets.empty();
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
297