124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DWARFCompileUnit.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 "DWARFCompileUnit.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton#include "lldb/Core/Mangled.h"
1375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton#include "lldb/Core/Module.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
16be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton#include "lldb/Symbol/CompileUnit.h"
17be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton#include "lldb/Symbol/LineTable.h"
18500d8ca225282b7c483213beb1224d64df77b6f5Greg Clayton#include "lldb/Symbol/ObjectFile.h"
193ad4da0f2c2afdea3352deaaf9c044855dc5c95bJim Ingham#include "lldb/Target/ObjCLanguageRuntime.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDebugAbbrev.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDebugAranges.h"
2312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton#include "DWARFDebugInfo.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDIECollection.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFFormValue.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "LogChannelDWARF.h"
2774124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton#include "NameToDIE.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "SymbolFileDWARF.h"
2900f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata#include "SymbolFileDWARFDebugMap.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Claytonusing namespace lldb;
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace std;
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerextern int g_verbose;
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg ClaytonDWARFCompileUnit::DWARFCompileUnit(SymbolFileDWARF* dwarf2Data) :
39144188bc458a35997d2f2e52206ab69747439073Greg Clayton    m_dwarf2Data    (dwarf2Data),
40144188bc458a35997d2f2e52206ab69747439073Greg Clayton    m_abbrevs       (NULL),
41144188bc458a35997d2f2e52206ab69747439073Greg Clayton    m_user_data     (NULL),
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_die_array     (),
43144188bc458a35997d2f2e52206ab69747439073Greg Clayton    m_func_aranges_ap (),
44144188bc458a35997d2f2e52206ab69747439073Greg Clayton    m_base_addr     (0),
45144188bc458a35997d2f2e52206ab69747439073Greg Clayton    m_offset        (DW_INVALID_OFFSET),
46144188bc458a35997d2f2e52206ab69747439073Greg Clayton    m_length        (0),
47144188bc458a35997d2f2e52206ab69747439073Greg Clayton    m_version       (0),
48e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    m_addr_size     (DWARFCompileUnit::GetDefaultAddressSize()),
4914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    m_producer      (eProducerInvalid),
5014fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    m_producer_version_major (0),
5114fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    m_producer_version_minor (0),
5214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    m_producer_version_update (0)
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::Clear()
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_offset        = DW_INVALID_OFFSET;
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_length        = 0;
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_version       = 0;
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_abbrevs       = NULL;
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_addr_size     = DWARFCompileUnit::GetDefaultAddressSize();
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_base_addr     = 0;
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_die_array.clear();
66144188bc458a35997d2f2e52206ab69747439073Greg Clayton    m_func_aranges_ap.reset();
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_user_data     = NULL;
68e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    m_producer      = eProducerInvalid;
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
7236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonDWARFCompileUnit::Extract(const DataExtractor &debug_info, lldb::offset_t *offset_ptr)
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear();
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_offset = *offset_ptr;
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (debug_info.ValidOffset(*offset_ptr))
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        dw_offset_t abbr_offset;
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const DWARFDebugAbbrev *abbr = m_dwarf2Data->DebugAbbrev();
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_length        = debug_info.GetU32(offset_ptr);
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_version       = debug_info.GetU16(offset_ptr);
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        abbr_offset     = debug_info.GetU32(offset_ptr);
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_addr_size     = debug_info.GetU8 (offset_ptr);
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool length_OK = debug_info.ValidOffset(GetNextCompileUnitOffset()-1);
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool version_OK = SymbolFileDWARF::SupportedVersion(m_version);
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool abbr_offset_OK = m_dwarf2Data->get_debug_abbrev_data().ValidOffset(abbr_offset);
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool addr_size_OK = ((m_addr_size == 4) || (m_addr_size == 8));
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (length_OK && version_OK && addr_size_OK && abbr_offset_OK && abbr != NULL)
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_abbrevs = abbr->GetAbbreviationDeclarationSet(abbr_offset);
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // reset the offset to where we tried to parse from if anything went wrong
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        *offset_ptr = m_offset;
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerdw_offset_t
10736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonDWARFCompileUnit::Extract(lldb::offset_t offset, const DataExtractor& debug_info_data, const DWARFAbbreviationDeclarationSet* abbrevs)
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear();
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_offset = offset;
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (debug_info_data.ValidOffset(offset))
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_length        = debug_info_data.GetU32(&offset);
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_version       = debug_info_data.GetU16(&offset);
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool abbrevs_OK = debug_info_data.GetU32(&offset) == abbrevs->GetOffset();
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_abbrevs       = abbrevs;
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_addr_size     = debug_info_data.GetU8 (&offset);
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool version_OK = SymbolFileDWARF::SupportedVersion(m_version);
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool addr_size_OK = ((m_addr_size == 4) || (m_addr_size == 8));
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (version_OK && addr_size_OK && abbrevs_OK && debug_info_data.ValidOffset(offset))
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return offset;
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return DW_INVALID_OFFSET;
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::ClearDIEs(bool keep_compile_unit_die)
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_die_array.size() > 1)
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // std::vectors never get any smaller when resized to a smaller size,
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // or when clear() or erase() are called, the size will report that it
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // is smaller, but the memory allocated remains intact (call capacity()
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // to see this). So we need to create a temporary vector and swap the
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // contents which will cause just the internal pointers to be swapped
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // so that when "tmp_array" goes out of scope, it will destroy the
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // contents.
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Save at least the compile unit DIE
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DWARFDebugInfoEntry::collection tmp_array;
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_die_array.swap(tmp_array);
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (keep_compile_unit_die)
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_die_array.push_back(tmp_array.front());
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ParseCompileUnitDIEsIfNeeded
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
154f9be01f34a0dfba22106652a687e3d7c4eebce00Johnny Chen// Parses a compile unit and indexes its DIEs if it hasn't already been
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// done.
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::ExtractDIEsIfNeeded (bool cu_die_only)
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t initial_die_array_size = m_die_array.size();
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if ((cu_die_only && initial_die_array_size > 0) || initial_die_array_size > 1)
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0; // Already parsed
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__,
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        "%8.8x: DWARFCompileUnit::ExtractDIEsIfNeeded( cu_die_only = %i )",
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        m_offset,
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        cu_die_only);
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1699f5082f85e6a879d236dbd038762651391353769Stephen Wilson    // Set the offset to that of the first DIE and calculate the start of the
1709f5082f85e6a879d236dbd038762651391353769Stephen Wilson    // next compilation unit header.
17136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    lldb::offset_t offset = GetFirstDIEOffset();
17236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    lldb::offset_t next_cu_offset = GetNextCompileUnitOffset();
1739f5082f85e6a879d236dbd038762651391353769Stephen Wilson
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFDebugInfoEntry die;
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Keep a flat array of the DIE for binary lookup by DIE offset
17675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    if (!cu_die_only)
17775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
178952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO | DWARF_LOG_LOOKUPS));
17975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        if (log)
18075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        {
181952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton            m_dwarf2Data->GetObjectFile()->GetModule()->LogMessageVerboseBacktrace (log,
18273a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton                                                                                    "DWARFCompileUnit::ExtractDIEsIfNeeded () for compile unit at .debug_info[0x%8.8x]",
18373a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton                                                                                    GetOffset());
18475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        }
18575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t depth = 0;
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // We are in our compile unit, parse starting at the offset
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we were told to parse
1905fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    const DataExtractor& debug_info_data = m_dwarf2Data->get_debug_info_data();
191489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton    std::vector<uint32_t> die_index_stack;
192489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton    die_index_stack.reserve(32);
193489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton    die_index_stack.push_back(0);
194489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton    bool prev_die_had_children = false;
1955fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (GetAddressByteSize());
1969f5082f85e6a879d236dbd038762651391353769Stephen Wilson    while (offset < next_cu_offset &&
1979f5082f85e6a879d236dbd038762651391353769Stephen Wilson           die.FastExtract (debug_info_data, this, fixed_form_sizes, &offset))
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1995fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton//        if (log)
2005fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton//            log->Printf("0x%8.8x: %*.*s%s%s",
2015fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton//                        die.GetOffset(),
2025fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton//                        depth * 2, depth * 2, "",
2035fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton//                        DW_TAG_value_to_name (die.Tag()),
2045fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton//                        die.HasChildren() ? " *" : "");
2055fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton
206489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton        const bool null_die = die.IsNULL();
2075fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton        if (depth == 0)
2085fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton        {
2095fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton            uint64_t base_addr = die.GetAttributeValueAsUnsigned(m_dwarf2Data, this, DW_AT_low_pc, LLDB_INVALID_ADDRESS);
2105fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton            if (base_addr == LLDB_INVALID_ADDRESS)
2115fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton                base_addr = die.GetAttributeValueAsUnsigned(m_dwarf2Data, this, DW_AT_entry_pc, 0);
2125fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton            SetBaseAddress (base_addr);
213489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton            if (initial_die_array_size == 0)
214489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                AddDIE (die);
215489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton            if (cu_die_only)
216489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                return 1;
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
220489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton            if (null_die)
221489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton            {
222489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                if (prev_die_had_children)
223489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                {
224489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                    // This will only happen if a DIE says is has children
225489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                    // but all it contains is a NULL tag. Since we are removing
226489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                    // the NULL DIEs from the list (saves up to 25% in C++ code),
227489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                    // we need a way to let the DIE know that it actually doesn't
228489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                    // have children.
229489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                    if (!m_die_array.empty())
230489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                        m_die_array.back().SetEmptyChildren(true);
231489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                }
232489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton            }
233489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton            else
234489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton            {
235489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                die.SetParentIndex(m_die_array.size() - die_index_stack[depth-1]);
236489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton
237489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                if (die_index_stack.back())
238489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                    m_die_array[die_index_stack.back()].SetSiblingIndex(m_die_array.size()-die_index_stack.back());
239489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton
240489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                // Only push the DIE if it isn't a NULL DIE
241489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                    m_die_array.push_back(die);
242489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton            }
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
245489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton        if (null_die)
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // NULL DIE.
248489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton            if (!die_index_stack.empty())
249489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                die_index_stack.pop_back();
250489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (depth > 0)
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                --depth;
2535fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton            if (depth == 0)
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;  // We are done with this compile unit!
255489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton
256489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton            prev_die_had_children = false;
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
2580963fdd2478c6404d11b96e7d5ae1f2de8b3bb1fGreg Clayton        else
2590963fdd2478c6404d11b96e7d5ae1f2de8b3bb1fGreg Clayton        {
260489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton            die_index_stack.back() = m_die_array.size() - 1;
2610963fdd2478c6404d11b96e7d5ae1f2de8b3bb1fGreg Clayton            // Normal DIE
262489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton            const bool die_has_children = die.HasChildren();
263489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton            if (die_has_children)
264489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton            {
265489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton                die_index_stack.push_back(0);
2660963fdd2478c6404d11b96e7d5ae1f2de8b3bb1fGreg Clayton                ++depth;
267489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton            }
268489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton            prev_die_had_children = die_has_children;
2690963fdd2478c6404d11b96e7d5ae1f2de8b3bb1fGreg Clayton        }
2709f5082f85e6a879d236dbd038762651391353769Stephen Wilson    }
2719f5082f85e6a879d236dbd038762651391353769Stephen Wilson
2729f5082f85e6a879d236dbd038762651391353769Stephen Wilson    // Give a little bit of info if we encounter corrupt DWARF (our offset
2739f5082f85e6a879d236dbd038762651391353769Stephen Wilson    // should always terminate at or before the start of the next compilation
2749f5082f85e6a879d236dbd038762651391353769Stephen Wilson    // unit header).
2759f5082f85e6a879d236dbd038762651391353769Stephen Wilson    if (offset > next_cu_offset)
2769f5082f85e6a879d236dbd038762651391353769Stephen Wilson    {
27736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        m_dwarf2Data->GetObjectFile()->GetModule()->ReportWarning ("DWARF compile unit extends beyond its bounds cu 0x%8.8x at 0x%8.8" PRIx64 "\n",
278df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                                                                   GetOffset(),
279df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                                                                   offset);
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
281c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton
282c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton    // Since std::vector objects will double their size, we really need to
283c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton    // make a new array with the perfect size so we don't end up wasting
284c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton    // space. So here we copy and swap to make sure we don't have any extra
285c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton    // memory taken up.
286489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton
287c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton    if (m_die_array.size () < m_die_array.capacity())
288c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton    {
289c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton        DWARFDebugInfoEntry::collection exact_size_die_array (m_die_array.begin(), m_die_array.end());
290c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton        exact_size_die_array.swap (m_die_array);
291c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton    }
292952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log (LogChannelDWARF::GetLogIfAll (DWARF_LOG_DEBUG_INFO | DWARF_LOG_VERBOSE));
293489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton    if (log)
294489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton    {
295489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton        StreamString strm;
296489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton        DWARFDebugInfoEntry::DumpDIECollection (strm, m_die_array);
297489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton        log->PutCString (strm.GetString().c_str());
298489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton    }
2999f5082f85e6a879d236dbd038762651391353769Stephen Wilson
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_die_array.size();
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerdw_offset_t
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::GetAbbrevOffset() const
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_abbrevs ? m_abbrevs->GetOffset() : DW_INVALID_OFFSET;
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::Verify(Stream *s) const
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const DataExtractor& debug_info = m_dwarf2Data->get_debug_info_data();
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool valid_offset = debug_info.ValidOffset(m_offset);
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool length_OK = debug_info.ValidOffset(GetNextCompileUnitOffset()-1);
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool version_OK = SymbolFileDWARF::SupportedVersion(m_version);
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool abbr_offset_OK = m_dwarf2Data->get_debug_abbrev_data().ValidOffset(GetAbbrevOffset());
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool addr_size_OK = ((m_addr_size == 4) || (m_addr_size == 8));
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool verbose = s->GetVerbose();
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (valid_offset && length_OK && version_OK && addr_size_OK && abbr_offset_OK)
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (verbose)
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            s->Printf("    0x%8.8x: OK\n", m_offset);
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->Printf("    0x%8.8x: ", m_offset);
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_dwarf2Data->get_debug_info_data().Dump (s, m_offset, lldb::eFormatHex, 1, Size(), 32, LLDB_INVALID_ADDRESS, 0, 0);
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->EOL();
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (valid_offset)
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!length_OK)
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s->Printf("        The length (0x%8.8x) for this compile unit is too large for the .debug_info provided.\n", m_length);
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!version_OK)
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s->Printf("        The 16 bit compile unit header version is not supported.\n");
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!abbr_offset_OK)
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s->Printf("        The offset into the .debug_abbrev section (0x%8.8x) is not valid.\n", GetAbbrevOffset());
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!addr_size_OK)
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s->Printf("        The address size is unsupported: 0x%2.2x\n", m_addr_size);
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            s->Printf("        The start offset of the compile unit header in the .debug_info is invalid.\n");
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::Dump(Stream *s) const
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf("0x%8.8x: Compile Unit: length = 0x%8.8x, version = 0x%4.4x, abbr_offset = 0x%8.8x, addr_size = 0x%2.2x (next CU at {0x%8.8x})\n",
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_offset, m_length, m_version, GetAbbrevOffset(), m_addr_size, GetNextCompileUnitOffset());
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint8_t g_default_addr_size = 4;
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint8_t
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::GetAddressByteSize(const DWARFCompileUnit* cu)
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cu)
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return cu->GetAddressByteSize();
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return DWARFCompileUnit::GetDefaultAddressSize();
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint8_t
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::GetDefaultAddressSize()
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return g_default_addr_size;
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::SetDefaultAddressSize(uint8_t addr_size)
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    g_default_addr_size = addr_size;
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
382144188bc458a35997d2f2e52206ab69747439073Greg Claytonvoid
383144188bc458a35997d2f2e52206ab69747439073Greg ClaytonDWARFCompileUnit::BuildAddressRangeTable (SymbolFileDWARF* dwarf2Data,
384144188bc458a35997d2f2e52206ab69747439073Greg Clayton                                          DWARFDebugAranges* debug_aranges,
385144188bc458a35997d2f2e52206ab69747439073Greg Clayton                                          bool clear_dies_if_already_not_parsed)
386144188bc458a35997d2f2e52206ab69747439073Greg Clayton{
387144188bc458a35997d2f2e52206ab69747439073Greg Clayton    // This function is usually called if there in no .debug_aranges section
388144188bc458a35997d2f2e52206ab69747439073Greg Clayton    // in order to produce a compile unit level set of address ranges that
389144188bc458a35997d2f2e52206ab69747439073Greg Clayton    // is accurate. If the DIEs weren't parsed, then we don't want all dies for
390144188bc458a35997d2f2e52206ab69747439073Greg Clayton    // all compile units to stay loaded when they weren't needed. So we can end
391144188bc458a35997d2f2e52206ab69747439073Greg Clayton    // up parsing the DWARF and then throwing them all away to keep memory usage
392144188bc458a35997d2f2e52206ab69747439073Greg Clayton    // down.
393144188bc458a35997d2f2e52206ab69747439073Greg Clayton    const bool clear_dies = ExtractDIEsIfNeeded (false) > 1;
394144188bc458a35997d2f2e52206ab69747439073Greg Clayton
3956f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham    const DWARFDebugInfoEntry* die = DIE();
3966f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham    if (die)
3976f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham        die->BuildAddressRangeTable(dwarf2Data, this, debug_aranges);
398144188bc458a35997d2f2e52206ab69747439073Greg Clayton
399be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton    if (debug_aranges->IsEmpty())
400be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton    {
401be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton        // We got nothing from the functions, maybe we have a line tables only
402be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton        // situation. Check the line tables and build the arange table from this.
403be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton        SymbolContext sc;
404be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton        sc.comp_unit = dwarf2Data->GetCompUnitForDWARFCompUnit(this);
405be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton        if (sc.comp_unit)
406be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton        {
40700f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata            SymbolFileDWARFDebugMap *debug_map_sym_file = m_dwarf2Data->GetDebugMapSymfile();
40800f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata            if (debug_map_sym_file == NULL)
409be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton            {
41000f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                LineTable *line_table = sc.comp_unit->GetLineTable();
41100f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata
41200f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                if (line_table)
413be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton                {
41400f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                    LineTable::FileAddressRanges file_ranges;
41500f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                    const bool append = true;
41600f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                    const size_t num_ranges = line_table->GetContiguousFileAddressRanges (file_ranges, append);
41700f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                    for (uint32_t idx=0; idx<num_ranges; ++idx)
41800f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                    {
41900f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                        const LineTable::FileAddressRanges::Entry &range = file_ranges.GetEntryRef(idx);
42000f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                        debug_aranges->AppendRange(GetOffset(), range.GetRangeBase(), range.GetRangeEnd());
42100f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                        printf ("0x%8.8x: [0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ")\n", GetOffset(), range.GetRangeBase(), range.GetRangeEnd());
42200f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                    }
423be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton                }
424be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton            }
42500f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata            else
42600f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                debug_map_sym_file->AddOSOARanges(dwarf2Data,debug_aranges);
427be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton        }
428be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton    }
429be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton
430144188bc458a35997d2f2e52206ab69747439073Greg Clayton    // Keep memory down by clearing DIEs if this generate function
431144188bc458a35997d2f2e52206ab69747439073Greg Clayton    // caused them to be parsed
432144188bc458a35997d2f2e52206ab69747439073Greg Clayton    if (clear_dies)
433144188bc458a35997d2f2e52206ab69747439073Greg Clayton        ClearDIEs (true);
434144188bc458a35997d2f2e52206ab69747439073Greg Clayton
435144188bc458a35997d2f2e52206ab69747439073Greg Clayton}
436144188bc458a35997d2f2e52206ab69747439073Greg Clayton
437144188bc458a35997d2f2e52206ab69747439073Greg Clayton
438144188bc458a35997d2f2e52206ab69747439073Greg Claytonconst DWARFDebugAranges &
439144188bc458a35997d2f2e52206ab69747439073Greg ClaytonDWARFCompileUnit::GetFunctionAranges ()
440144188bc458a35997d2f2e52206ab69747439073Greg Clayton{
441144188bc458a35997d2f2e52206ab69747439073Greg Clayton    if (m_func_aranges_ap.get() == NULL)
442144188bc458a35997d2f2e52206ab69747439073Greg Clayton    {
443144188bc458a35997d2f2e52206ab69747439073Greg Clayton        m_func_aranges_ap.reset (new DWARFDebugAranges());
444952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_ARANGES));
445144188bc458a35997d2f2e52206ab69747439073Greg Clayton
446144188bc458a35997d2f2e52206ab69747439073Greg Clayton        if (log)
44775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        {
448952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton            m_dwarf2Data->GetObjectFile()->GetModule()->LogMessage (log,
449df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                                                                    "DWARFCompileUnit::GetFunctionAranges() for compile unit at .debug_info[0x%8.8x]",
450df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                                                                    GetOffset());
45175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        }
4526f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham        const DWARFDebugInfoEntry* die = DIE();
4536f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham        if (die)
4546f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham            die->BuildFunctionAddressRangeTable (m_dwarf2Data, this, m_func_aranges_ap.get());
455144188bc458a35997d2f2e52206ab69747439073Greg Clayton        const bool minimize = false;
456257663e753af15633e48c7b00eb7b5880168090bGreg Clayton        m_func_aranges_ap->Sort(minimize);
457144188bc458a35997d2f2e52206ab69747439073Greg Clayton    }
458144188bc458a35997d2f2e52206ab69747439073Greg Clayton    return *m_func_aranges_ap.get();
459144188bc458a35997d2f2e52206ab69747439073Greg Clayton}
460144188bc458a35997d2f2e52206ab69747439073Greg Clayton
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::LookupAddress
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const dw_addr_t address,
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFDebugInfoEntry** function_die_handle,
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFDebugInfoEntry** block_die_handle
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool success = false;
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (function_die_handle != NULL && DIE())
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
473144188bc458a35997d2f2e52206ab69747439073Greg Clayton
474144188bc458a35997d2f2e52206ab69747439073Greg Clayton        const DWARFDebugAranges &func_aranges = GetFunctionAranges ();
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Re-check the aranges auto pointer contents in case it was created above
477144188bc458a35997d2f2e52206ab69747439073Greg Clayton        if (!func_aranges.IsEmpty())
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
479144188bc458a35997d2f2e52206ab69747439073Greg Clayton            *function_die_handle = GetDIEPtr(func_aranges.FindAddress(address));
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (*function_die_handle != NULL)
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                success = true;
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (block_die_handle != NULL)
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    DWARFDebugInfoEntry* child = (*function_die_handle)->GetFirstChild();
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    while (child)
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (child->LookupAddress(address, m_dwarf2Data, this, NULL, block_die_handle))
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child = child->GetSibling();
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return success;
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Compare function DWARFDebugAranges::Range structures
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic bool CompareDIEOffset (const DWARFDebugInfoEntry& die1, const DWARFDebugInfoEntry& die2)
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return die1.GetOffset() < die2.GetOffset();
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// GetDIEPtr()
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the DIE (Debug Information Entry) with the specified offset.
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugInfoEntry*
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::GetDIEPtr(dw_offset_t die_offset)
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (die_offset != DW_INVALID_OFFSET)
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ExtractDIEsIfNeeded (false);
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DWARFDebugInfoEntry compare_die;
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        compare_die.SetOffset(die_offset);
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DWARFDebugInfoEntry::iterator end = m_die_array.end();
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DWARFDebugInfoEntry::iterator pos = lower_bound(m_die_array.begin(), end, compare_die, CompareDIEOffset);
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (pos != end)
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (die_offset == (*pos).GetOffset())
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return &(*pos);
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;    // Not found in any compile units
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// GetDIEPtrContainingOffset()
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the DIE (Debug Information Entry) that contains the specified
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// .debug_info offset.
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DWARFDebugInfoEntry*
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::GetDIEPtrContainingOffset(dw_offset_t die_offset)
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (die_offset != DW_INVALID_OFFSET)
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ExtractDIEsIfNeeded (false);
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DWARFDebugInfoEntry compare_die;
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        compare_die.SetOffset(die_offset);
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DWARFDebugInfoEntry::iterator end = m_die_array.end();
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DWARFDebugInfoEntry::iterator pos = lower_bound(m_die_array.begin(), end, compare_die, CompareDIEOffset);
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (pos != end)
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (die_offset >= (*pos).GetOffset())
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                DWARFDebugInfoEntry::iterator next = pos + 1;
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (next != end)
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (die_offset < (*next).GetOffset())
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return &(*pos);
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;    // Not found in any compile units
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::AppendDIEsWithTag (const dw_tag_t tag, DWARFDIECollection& dies, uint32_t depth) const
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t old_size = dies.Size();
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFDebugInfoEntry::const_iterator pos;
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFDebugInfoEntry::const_iterator end = m_die_array.end();
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = m_die_array.begin(); pos != end; ++pos)
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (pos->Tag() == tag)
574b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton            dies.Append (&(*pos));
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Return the number of DIEs added to the collection
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return dies.Size() - old_size;
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58174124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//void
58274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//DWARFCompileUnit::AddGlobalDIEByIndex (uint32_t die_idx)
58374124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//{
58474124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//    m_global_die_indexes.push_back (die_idx);
58574124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//}
58674124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//
58774124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//
58874124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//void
58974124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//DWARFCompileUnit::AddGlobal (const DWARFDebugInfoEntry* die)
59074124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//{
59174124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//    // Indexes to all file level global and static variables
59274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//    m_global_die_indexes;
59374124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//
59474124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//    if (m_die_array.empty())
59574124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//        return;
59674124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//
59774124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//    const DWARFDebugInfoEntry* first_die = &m_die_array[0];
59874124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//    const DWARFDebugInfoEntry* end = first_die + m_die_array.size();
59974124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//    if (first_die <= die && die < end)
60074124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//        m_global_die_indexes.push_back (die - first_die);
60174124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//}
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
605144188bc458a35997d2f2e52206ab69747439073Greg ClaytonDWARFCompileUnit::Index (const uint32_t cu_idx,
606144188bc458a35997d2f2e52206ab69747439073Greg Clayton                         NameToDIE& func_basenames,
607144188bc458a35997d2f2e52206ab69747439073Greg Clayton                         NameToDIE& func_fullnames,
608144188bc458a35997d2f2e52206ab69747439073Greg Clayton                         NameToDIE& func_methods,
609144188bc458a35997d2f2e52206ab69747439073Greg Clayton                         NameToDIE& func_selectors,
610144188bc458a35997d2f2e52206ab69747439073Greg Clayton                         NameToDIE& objc_class_selectors,
611144188bc458a35997d2f2e52206ab69747439073Greg Clayton                         NameToDIE& globals,
612144188bc458a35997d2f2e52206ab69747439073Greg Clayton                         NameToDIE& types,
613144188bc458a35997d2f2e52206ab69747439073Greg Clayton                         NameToDIE& namespaces)
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const DataExtractor* debug_str = &m_dwarf2Data->get_debug_str_data();
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6175fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton    const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (GetAddressByteSize());
6185fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton
619952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log (LogChannelDWARF::GetLogIfAll (DWARF_LOG_LOOKUPS));
62075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
62175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    if (log)
62275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
623952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        m_dwarf2Data->GetObjectFile()->GetModule()->LogMessage (log,
624df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                                                                "DWARFCompileUnit::Index() for compile unit at .debug_info[0x%8.8x]",
625df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                                                                GetOffset());
62675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
62775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFDebugInfoEntry::const_iterator pos;
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFDebugInfoEntry::const_iterator begin = m_die_array.begin();
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFDebugInfoEntry::const_iterator end = m_die_array.end();
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = begin; pos != end; ++pos)
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const DWARFDebugInfoEntry &die = *pos;
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const dw_tag_t tag = die.Tag();
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (tag)
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_subprogram:
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_inlined_subroutine:
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_base_type:
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_class_type:
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_constant:
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_enumeration_type:
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_string_type:
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_subroutine_type:
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_structure_type:
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_union_type:
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_typedef:
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_namespace:
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_variable:
65218fedd7f4d22cf46d34698c1094ebc544a6f8bd8Greg Clayton        case DW_TAG_unspecified_type:
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            continue;
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DWARFDebugInfoEntry::Attributes attributes;
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const char *name = NULL;
661fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton        const char *mangled_cstr = NULL;
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool is_declaration = false;
6634a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton        //bool is_artificial = false;
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool has_address = false;
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool has_location = false;
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool is_global_or_static_variable = false;
66700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton
66812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        dw_offset_t specification_die_offset = DW_INVALID_OFFSET;
6695fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton        const size_t num_attributes = die.GetAttributes(m_dwarf2Data, this, fixed_form_sizes, attributes);
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (num_attributes > 0)
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
672bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton            for (uint32_t i=0; i<num_attributes; ++i)
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                dw_attr_t attr = attributes.AttributeAtIndex(i);
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                DWARFFormValue form_value;
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                switch (attr)
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case DW_AT_name:
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value))
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        name = form_value.AsCString(debug_str);
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case DW_AT_declaration:
684e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton                    if (attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value))
685e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton                        is_declaration = form_value.Unsigned() != 0;
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6884a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton//                case DW_AT_artificial:
6894a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton//                    if (attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value))
6904a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton//                        is_artificial = form_value.Unsigned() != 0;
6914a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton//                    break;
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case DW_AT_MIPS_linkage_name:
6946f3a711edcfaeca1efbb998cdea5d0a0782ddfa3Greg Clayton                case DW_AT_linkage_name:
69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value))
696fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                        mangled_cstr = form_value.AsCString(debug_str);
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case DW_AT_low_pc:
700178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                case DW_AT_high_pc:
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case DW_AT_ranges:
702178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                    has_address = true;
703178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                    break;
704178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case DW_AT_entry_pc:
70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    has_address = true;
70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case DW_AT_location:
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    has_location = true;
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (tag == DW_TAG_variable)
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const DWARFDebugInfoEntry* parent_die = die.GetParent();
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        while ( parent_die != NULL )
71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            switch (parent_die->Tag())
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            case DW_TAG_subprogram:
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            case DW_TAG_lexical_block:
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            case DW_TAG_inlined_subroutine:
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // Even if this is a function level static, we don't add it. We could theoretically
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // add these if we wanted to by introspecting into the DW_AT_location and seeing
72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // if the location describes a hard coded address, but we dont want the performance
72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // penalty of that right now.
72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                is_global_or_static_variable = false;
72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                              if (attributes.ExtractFormValueAtIndex(dwarf2Data, i, form_value))
72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                              {
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                  // If we have valid block data, then we have location expression bytes
72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                  // that are fixed (not a location list).
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                  const uint8_t *block_data = form_value.BlockData();
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                  if (block_data)
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                  {
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                      uint32_t block_length = form_value.Unsigned();
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                      if (block_length == 1 + attributes.CompileUnitAtIndex(i)->GetAddressByteSize())
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                      {
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                          if (block_data[0] == DW_OP_addr)
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                              add_die = true;
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                      }
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                  }
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                              }
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                parent_die = NULL;  // Terminate the while loop.
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                break;
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            case DW_TAG_compile_unit:
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                is_global_or_static_variable = true;
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                parent_die = NULL;  // Terminate the while loop.
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                break;
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            default:
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                parent_die = parent_die->GetParent();   // Keep going in the while loop.
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                break;
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
75612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
75712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                case DW_AT_specification:
75812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                    if (attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value))
75912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                        specification_die_offset = form_value.Reference(this);
76012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                    break;
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (tag)
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_subprogram:
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (has_address)
76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
77012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                if (name)
77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
772fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                    // Note, this check is also done in ParseMethodName, but since this is a hot loop, we do the
773fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham                    // simple inlined check outside the call.
774f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton                    ObjCLanguageRuntime::MethodName objc_method(name, true);
775f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton                    if (objc_method.IsValid(true))
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
777f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton                        ConstString objc_class_name_with_category (objc_method.GetClassNameWithCategory());
778f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton                        ConstString objc_selector_name (objc_method.GetSelector());
779f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton                        ConstString objc_fullname_no_category_name (objc_method.GetFullNameWithoutCategory(true));
780f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton                        ConstString objc_class_name_no_category (objc_method.GetClassName());
781f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton                        func_fullnames.Insert (ConstString(name), die.GetOffset());
782f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton                        if (objc_class_name_with_category)
783f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton                            objc_class_selectors.Insert(objc_class_name_with_category, die.GetOffset());
784f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton                        if (objc_class_name_no_category && objc_class_name_no_category != objc_class_name_with_category)
785f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton                            objc_class_selectors.Insert(objc_class_name_no_category, die.GetOffset());
786f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton                        if (objc_selector_name)
787f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton                            func_selectors.Insert (objc_selector_name, die.GetOffset());
788f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton                        if (objc_fullname_no_category_name)
789f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton                            func_fullnames.Insert (objc_fullname_no_category_name, die.GetOffset());
79012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                    }
79112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                    // If we have a mangled name, then the DW_AT_name attribute
79212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                    // is usually the method name without the class or any parameters
79312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                    const DWARFDebugInfoEntry *parent = die.GetParent();
79412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                    bool is_method = false;
79512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                    if (parent)
79612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                    {
797bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton                        dw_tag_t parent_tag = parent->Tag();
798bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton                        if (parent_tag == DW_TAG_class_type || parent_tag == DW_TAG_structure_type)
79912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                        {
80012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                            is_method = true;
80112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                        }
80212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                        else
80312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                        {
804c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton                            if (specification_die_offset != DW_INVALID_OFFSET)
80512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                            {
806df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                                const DWARFDebugInfoEntry *specification_die = m_dwarf2Data->DebugInfo()->GetDIEPtr (specification_die_offset, NULL);
80712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                                if (specification_die)
80812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                                {
80912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                                    parent = specification_die->GetParent();
81012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                                    if (parent)
81112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                                    {
812bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton                                        parent_tag = parent->Tag();
81312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
814bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton                                        if (parent_tag == DW_TAG_class_type || parent_tag == DW_TAG_structure_type)
81512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                                            is_method = true;
81612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                                    }
81712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                                }
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
82112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
82274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton
82312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                    if (is_method)
824144188bc458a35997d2f2e52206ab69747439073Greg Clayton                        func_methods.Insert (ConstString(name), die.GetOffset());
82512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                    else
826144188bc458a35997d2f2e52206ab69747439073Greg Clayton                        func_basenames.Insert (ConstString(name), die.GetOffset());
827c1c3690a9f1d01fe103ff56baa4b36da99b6659eMatt Kopec
828c1c3690a9f1d01fe103ff56baa4b36da99b6659eMatt Kopec                    if (!is_method && !mangled_cstr && !objc_method.IsValid(true))
829c1c3690a9f1d01fe103ff56baa4b36da99b6659eMatt Kopec                        func_fullnames.Insert (ConstString(name), die.GetOffset());
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
831fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                if (mangled_cstr)
832fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                {
833fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                    // Make sure our mangled name isn't the same string table entry
834fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                    // as our name. If it starts with '_', then it is ok, else compare
835fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                    // the string to make sure it isn't the same and we don't end up
836fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                    // with duplicate entries
8374a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton                    if (name != mangled_cstr && ((mangled_cstr[0] == '_') || (name && ::strcmp(name, mangled_cstr) != 0)))
838fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                    {
839c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton                        Mangled mangled (ConstString(mangled_cstr), true);
840144188bc458a35997d2f2e52206ab69747439073Greg Clayton                        func_fullnames.Insert (mangled.GetMangledName(), die.GetOffset());
841fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                        if (mangled.GetDemangledName())
842144188bc458a35997d2f2e52206ab69747439073Greg Clayton                            func_fullnames.Insert (mangled.GetDemangledName(), die.GetOffset());
843fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                    }
844fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                }
84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_inlined_subroutine:
84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (has_address)
85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
85112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                if (name)
852144188bc458a35997d2f2e52206ab69747439073Greg Clayton                    func_basenames.Insert (ConstString(name), die.GetOffset());
853fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                if (mangled_cstr)
854fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                {
855fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                    // Make sure our mangled name isn't the same string table entry
856fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                    // as our name. If it starts with '_', then it is ok, else compare
857fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                    // the string to make sure it isn't the same and we don't end up
858fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                    // with duplicate entries
859fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                    if (name != mangled_cstr && ((mangled_cstr[0] == '_') || (::strcmp(name, mangled_cstr) != 0)))
860fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                    {
861c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton                        Mangled mangled (ConstString(mangled_cstr), true);
862144188bc458a35997d2f2e52206ab69747439073Greg Clayton                        func_fullnames.Insert (mangled.GetMangledName(), die.GetOffset());
863fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                        if (mangled.GetDemangledName())
864144188bc458a35997d2f2e52206ab69747439073Greg Clayton                            func_fullnames.Insert (mangled.GetDemangledName(), die.GetOffset());
865fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                    }
866fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                }
867c1c3690a9f1d01fe103ff56baa4b36da99b6659eMatt Kopec                else
868c1c3690a9f1d01fe103ff56baa4b36da99b6659eMatt Kopec                    func_fullnames.Insert (ConstString(name), die.GetOffset());
86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_base_type:
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_class_type:
87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_constant:
87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_enumeration_type:
87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_string_type:
87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_subroutine_type:
87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_structure_type:
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_union_type:
88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_typedef:
88118fedd7f4d22cf46d34698c1094ebc544a6f8bd8Greg Clayton        case DW_TAG_unspecified_type:
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (name && is_declaration == false)
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
884144188bc458a35997d2f2e52206ab69747439073Greg Clayton                types.Insert (ConstString(name), die.GetOffset());
88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
888fcf06fb0b608f09477d7984938255ebf8f92d0daGreg Clayton        case DW_TAG_namespace:
889fcf06fb0b608f09477d7984938255ebf8f92d0daGreg Clayton            if (name)
890144188bc458a35997d2f2e52206ab69747439073Greg Clayton                namespaces.Insert (ConstString(name), die.GetOffset());
891fcf06fb0b608f09477d7984938255ebf8f92d0daGreg Clayton            break;
892fcf06fb0b608f09477d7984938255ebf8f92d0daGreg Clayton
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_TAG_variable:
89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (name && has_location && is_global_or_static_variable)
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
896144188bc458a35997d2f2e52206ab69747439073Greg Clayton                globals.Insert (ConstString(name), die.GetOffset());
8973bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                // Be sure to include variables by their mangled and demangled
8983bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                // names if they have any since a variable can have a basename
8993bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                // "i", a mangled named "_ZN12_GLOBAL__N_11iE" and a demangled
9003bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                // mangled name "(anonymous namespace)::i"...
901fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton
902fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                // Make sure our mangled name isn't the same string table entry
903fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                // as our name. If it starts with '_', then it is ok, else compare
904fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                // the string to make sure it isn't the same and we don't end up
905fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                // with duplicate entries
906fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                if (mangled_cstr && name != mangled_cstr && ((mangled_cstr[0] == '_') || (::strcmp(name, mangled_cstr) != 0)))
907fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                {
908c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton                    Mangled mangled (ConstString(mangled_cstr), true);
909144188bc458a35997d2f2e52206ab69747439073Greg Clayton                    globals.Insert (mangled.GetMangledName(), die.GetOffset());
910fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                    if (mangled.GetDemangledName())
911144188bc458a35997d2f2e52206ab69747439073Greg Clayton                        globals.Insert (mangled.GetDemangledName(), die.GetOffset());
912fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton                }
91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            continue;
91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
922e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Claytonbool
92314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg ClaytonDWARFCompileUnit::Supports_unnamed_objc_bitfields ()
92414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton{
92514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    if (GetProducer() == eProducerClang)
92614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    {
9272c825fbece34da5ef4ce0e3564c5d60c63bd51ddGreg Clayton        const uint32_t major_version = GetProducerVersionMajor();
9282c825fbece34da5ef4ce0e3564c5d60c63bd51ddGreg Clayton        if (major_version > 425 || (major_version == 425 && GetProducerVersionUpdate() >= 13))
92914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton            return true;
93014fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton        else
93114fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton            return false;
93214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    }
93314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    return true; // Assume all other compilers didn't have incorrect ObjC bitfield info
93414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton}
93514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton
93614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Claytonbool
937e6b976d3f1c42f18c85c87cb179954af7df5a542Greg ClaytonDWARFCompileUnit::Supports_DW_AT_APPLE_objc_complete_type ()
938e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton{
93914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    if (GetProducer() == eProducerLLVMGCC)
940e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        return false;
941e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    return true;
942e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton}
943e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton
944e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Claytonbool
945e6b976d3f1c42f18c85c87cb179954af7df5a542Greg ClaytonDWARFCompileUnit::DW_AT_decl_file_attributes_are_invalid()
946e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton{
947e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    // llvm-gcc makes completely invalid decl file attributes and won't ever
948e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    // be fixed, so we need to know to ignore these.
94914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    return GetProducer() == eProducerLLVMGCC;
950e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton}
951e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton
95214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Claytonvoid
95314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg ClaytonDWARFCompileUnit::ParseProducerInfo ()
954e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton{
95514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    m_producer_version_major = UINT32_MAX;
95614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    m_producer_version_minor = UINT32_MAX;
95714fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    m_producer_version_update = UINT32_MAX;
95814fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton
95914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    const DWARFDebugInfoEntry *die = GetCompileUnitDIEOnly();
96014fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    if (die)
961e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    {
96214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton
96314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton        const char *producer_cstr = die->GetAttributeValueAsString(m_dwarf2Data, this, DW_AT_producer, NULL);
96414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton        if (producer_cstr)
965e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        {
96614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton            RegularExpression llvm_gcc_regex("^4\\.[012]\\.[01] \\(Based on Apple Inc\\. build [0-9]+\\) \\(LLVM build [\\.0-9]+\\)$");
96714fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton            if (llvm_gcc_regex.Execute (producer_cstr))
968e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton            {
96914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton                m_producer = eProducerLLVMGCC;
970e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton            }
97114fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton            else if (strstr(producer_cstr, "clang"))
97214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton            {
97300af72e395d138f459192b7f5450fa4c7854f135Greg Clayton                static RegularExpression g_clang_version_regex("clang-([0-9]+)\\.([0-9]+)\\.([0-9]+)");
97400af72e395d138f459192b7f5450fa4c7854f135Greg Clayton                RegularExpression::Match regex_match(3);
97500af72e395d138f459192b7f5450fa4c7854f135Greg Clayton                if (g_clang_version_regex.Execute (producer_cstr, &regex_match))
97614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton                {
97714fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton                    std::string str;
97800af72e395d138f459192b7f5450fa4c7854f135Greg Clayton                    if (regex_match.GetMatchAtIndex (producer_cstr, 1, str))
97914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton                        m_producer_version_major = Args::StringToUInt32(str.c_str(), UINT32_MAX, 10);
98000af72e395d138f459192b7f5450fa4c7854f135Greg Clayton                    if (regex_match.GetMatchAtIndex (producer_cstr, 2, str))
98114fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton                        m_producer_version_minor = Args::StringToUInt32(str.c_str(), UINT32_MAX, 10);
98200af72e395d138f459192b7f5450fa4c7854f135Greg Clayton                    if (regex_match.GetMatchAtIndex (producer_cstr, 3, str))
98314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton                        m_producer_version_update = Args::StringToUInt32(str.c_str(), UINT32_MAX, 10);
98414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton                }
98514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton                m_producer = eProducerClang;
98614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton            }
98714fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton            else if (strstr(producer_cstr, "GNU"))
98814fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton                m_producer = eProducerGCC;
989e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        }
990e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    }
99114fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    if (m_producer == eProducerInvalid)
99214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton        m_producer = eProcucerOther;
99314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton}
99414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton
99514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg ClaytonDWARFCompileUnit::Producer
99614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg ClaytonDWARFCompileUnit::GetProducer ()
99714fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton{
99814fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    if (m_producer == eProducerInvalid)
99914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton        ParseProducerInfo ();
1000e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    return m_producer;
1001e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton}
1002e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton
1003e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton
100414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Claytonuint32_t
100514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg ClaytonDWARFCompileUnit::GetProducerVersionMajor()
100614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton{
100714fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    if (m_producer_version_major == 0)
100814fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton        ParseProducerInfo ();
100914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    return m_producer_version_major;
101014fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton}
101114fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton
101214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Claytonuint32_t
101314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg ClaytonDWARFCompileUnit::GetProducerVersionMinor()
101414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton{
101514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    if (m_producer_version_minor == 0)
101614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton        ParseProducerInfo ();
101714fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    return m_producer_version_minor;
101814fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton}
101914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton
102014fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Claytonuint32_t
102114fe7f1de593ba562787481ecdc455e46fe8c3c9Greg ClaytonDWARFCompileUnit::GetProducerVersionUpdate()
102214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton{
102314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    if (m_producer_version_update == 0)
102414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton        ParseProducerInfo ();
102514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton    return m_producer_version_update;
102614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton}
102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1028