SymbolFileDWARFDebugMap.cpp revision 3508c387c3f0c9ecc439d98048fd7694d41bab1b
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SymbolFileDWARFDebugMap.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 "SymbolFileDWARFDebugMap.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ModuleList.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamFile.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
18b01000fd063629facd45044f137446fb748ee179Greg Clayton
19b01000fd063629facd45044f137446fb748ee179Greg Clayton#include "lldb/Symbol/ClangExternalASTSourceCallbacks.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "SymbolFileDWARF.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::Initialize()
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PluginManager::RegisterPlugin (GetPluginNameStatic(),
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                   GetPluginDescriptionStatic(),
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                   CreateInstance);
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::Terminate()
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PluginManager::UnregisterPlugin (CreateInstance);
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginNameStatic()
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
47144188bc458a35997d2f2e52206ab69747439073Greg Clayton    return "dwarf-debugmap";
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginDescriptionStatic()
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return "DWARF and DWARF3 debug symbol file reader (debug map).";
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFile*
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CreateInstance (ObjectFile* obj_file)
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return new SymbolFileDWARFDebugMap (obj_file);
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::SymbolFileDWARFDebugMap (ObjectFile* ofile) :
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFile(ofile),
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_flags(),
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_compile_unit_infos(),
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_func_indexes(),
68e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    m_glob_indexes(),
69e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    m_supports_DW_AT_APPLE_objc_complete_type (eLazyBoolCalculate)
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::~SymbolFileDWARFDebugMap()
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid
79b01000fd063629facd45044f137446fb748ee179Greg ClaytonSymbolFileDWARFDebugMap::InitializeObject()
80e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton{
81b01000fd063629facd45044f137446fb748ee179Greg Clayton    // Install our external AST source callbacks so we can complete Clang types.
82b01000fd063629facd45044f137446fb748ee179Greg Clayton    llvm::OwningPtr<clang::ExternalASTSource> ast_source_ap (
83b01000fd063629facd45044f137446fb748ee179Greg Clayton        new ClangExternalASTSourceCallbacks (SymbolFileDWARFDebugMap::CompleteTagDecl,
84b01000fd063629facd45044f137446fb748ee179Greg Clayton                                             SymbolFileDWARFDebugMap::CompleteObjCInterfaceDecl,
85e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                                             NULL,
863fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                                             SymbolFileDWARFDebugMap::LayoutRecordType,
87b01000fd063629facd45044f137446fb748ee179Greg Clayton                                             this));
88b01000fd063629facd45044f137446fb748ee179Greg Clayton
89b01000fd063629facd45044f137446fb748ee179Greg Clayton    GetClangASTContext().SetExternalSource (ast_source_ap);
90e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton}
91e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton
92b01000fd063629facd45044f137446fb748ee179Greg Clayton
93b01000fd063629facd45044f137446fb748ee179Greg Clayton
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::InitOSO ()
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_flags.test(kHaveInitializedOSOs))
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_flags.set(kHaveInitializedOSOs);
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // In order to get the abilities of this plug-in, we look at the list of
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // N_OSO entries (object files) from the symbol table and make sure that
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // these files exist and also contain valid DWARF. If we get any of that
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // then we return the abilities of the first N_OSO's DWARF.
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Symtab* symtab = m_obj_file->GetSymtab();
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symtab)
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::vector<uint32_t> oso_indexes;
110cd151697a4b4d32d8818488b793ea44712945448Greg Clayton//      StreamFile s(stdout);
111cd151697a4b4d32d8818488b793ea44712945448Greg Clayton//      symtab->Dump(&s, NULL, eSortOrderNone);
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
113cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        // When a mach-o symbol is encoded, the n_type field is encoded in bits
114cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        // 23:16, and the n_desc field is encoded in bits 15:0.
115cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        //
116cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        // To find all N_OSO entries that are part of the DWARF + debug map
117cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        // we find only object file symbols with the flags value as follows:
118cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        // bits 23:16 == 0x66 (N_OSO)
119cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        // bits 15: 0 == 0x0001 (specifies this is a debug map object file)
120cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        const uint32_t k_oso_symbol_flags_value = 0x660001u;
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
122cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        const uint32_t oso_index_count = symtab->AppendSymbolIndexesWithTypeAndFlagsValue(eSymbolTypeObjectFile, k_oso_symbol_flags_value, oso_indexes);
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (oso_index_count > 0)
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
126cd151697a4b4d32d8818488b793ea44712945448Greg Clayton            symtab->AppendSymbolIndexesWithType (eSymbolTypeCode, Symtab::eDebugYes, Symtab::eVisibilityAny, m_func_indexes);
127cd151697a4b4d32d8818488b793ea44712945448Greg Clayton            symtab->AppendSymbolIndexesWithType (eSymbolTypeData, Symtab::eDebugYes, Symtab::eVisibilityAny, m_glob_indexes);
128cd151697a4b4d32d8818488b793ea44712945448Greg Clayton
129cd151697a4b4d32d8818488b793ea44712945448Greg Clayton            symtab->SortSymbolIndexesByValue(m_func_indexes, true);
130cd151697a4b4d32d8818488b793ea44712945448Greg Clayton            symtab->SortSymbolIndexesByValue(m_glob_indexes, true);
131cd151697a4b4d32d8818488b793ea44712945448Greg Clayton
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_compile_unit_infos.resize(oso_index_count);
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          s.Printf("%s N_OSO symbols:\n", __PRETTY_FUNCTION__);
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          symtab->Dump(&s, oso_indexes);
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (uint32_t i=0; i<oso_index_count; ++i)
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_compile_unit_infos[i].so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 1);
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (m_compile_unit_infos[i].so_symbol->GetSiblingIndex() == 0)
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_compile_unit_infos[i].so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 2);
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_compile_unit_infos[i].oso_symbol = symtab->SymbolAtIndex(oso_indexes[i]);
1427c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                uint32_t sibling_idx = m_compile_unit_infos[i].so_symbol->GetSiblingIndex();
1437c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                assert (sibling_idx != 0);
1447c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                assert (sibling_idx > i + 1);
1457c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                m_compile_unit_infos[i].last_symbol = symtab->SymbolAtIndex (sibling_idx - 1);
1467c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                m_compile_unit_infos[i].first_symbol_index = symtab->GetIndexForSymbol(m_compile_unit_infos[i].so_symbol);
1477c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                m_compile_unit_infos[i].last_symbol_index = symtab->GetIndexForSymbol(m_compile_unit_infos[i].last_symbol);
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule *
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetModuleByOSOIndex (uint32_t oso_idx)
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t cu_count = GetNumCompileUnits();
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_idx < cu_count)
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetModuleByCompUnitInfo (&m_compile_unit_infos[oso_idx]);
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule *
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetModuleByCompUnitInfo (CompileUnitInfo *comp_unit_info)
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (comp_unit_info->oso_module_sp.get() == NULL)
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symbol *oso_symbol = comp_unit_info->oso_symbol;
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (oso_symbol)
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
170537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton            FileSpec oso_file_spec(oso_symbol->GetMangled().GetName().AsCString(), true);
171e40b6424d9e49306392bec4b44060da36414c382Greg Clayton            // Always create a new module for .o files. Why? Because we
172e40b6424d9e49306392bec4b44060da36414c382Greg Clayton            // use the debug map, to add new sections to each .o file and
173e40b6424d9e49306392bec4b44060da36414c382Greg Clayton            // even though a .o file might not have changed, the sections
174e40b6424d9e49306392bec4b44060da36414c382Greg Clayton            // that get added to the .o file can change.
17513d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton            comp_unit_info->oso_module_sp.reset (new Module (oso_file_spec,
17613d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton                                                             m_obj_file->GetModule()->GetArchitecture(),
17713d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton                                                             NULL,
17813d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton                                                             0));
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return comp_unit_info->oso_module_sp.get();
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetFileSpecForSO (uint32_t oso_idx, FileSpec &file_spec)
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_idx < m_compile_unit_infos.size())
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!m_compile_unit_infos[oso_idx].so_file)
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_compile_unit_infos[oso_idx].so_symbol == NULL)
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::string so_path (m_compile_unit_infos[oso_idx].so_symbol->GetMangled().GetName().AsCString());
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_compile_unit_infos[oso_idx].so_symbol[1].GetType() == eSymbolTypeSourceFile)
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                so_path += m_compile_unit_infos[oso_idx].so_symbol[1].GetMangled().GetName().AsCString();
199537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton            m_compile_unit_infos[oso_idx].so_file.SetFile(so_path.c_str(), true);
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        file_spec = m_compile_unit_infos[oso_idx].so_file;
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile *
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetObjectFileByOSOIndex (uint32_t oso_idx)
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Module *oso_module = GetModuleByOSOIndex (oso_idx);
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_module)
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_module->GetObjectFile();
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF *
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFile (const SymbolContext& sc)
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompileUnitInfo *comp_unit_info = GetCompUnitInfo (sc);
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (comp_unit_info)
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetSymbolFileByCompUnitInfo (comp_unit_info);
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile *
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetObjectFileByCompUnitInfo (CompileUnitInfo *comp_unit_info)
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Module *oso_module = GetModuleByCompUnitInfo (comp_unit_info);
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_module)
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_module->GetObjectFile();
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
236444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton
237444e35b5fdf15a25a427285650f06f1390e62c75Greg Claytonuint32_t
238444e35b5fdf15a25a427285650f06f1390e62c75Greg ClaytonSymbolFileDWARFDebugMap::GetCompUnitInfoIndex (const CompileUnitInfo *comp_unit_info)
239444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton{
240444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    if (!m_compile_unit_infos.empty())
241444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    {
242444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton        const CompileUnitInfo *first_comp_unit_info = &m_compile_unit_infos.front();
243444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton        const CompileUnitInfo *last_comp_unit_info = &m_compile_unit_infos.back();
244444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton        if (first_comp_unit_info <= comp_unit_info && comp_unit_info <= last_comp_unit_info)
245444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton            return comp_unit_info - first_comp_unit_info;
246444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    }
247444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    return UINT32_MAX;
248444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton}
249444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF *
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFileByOSOIndex (uint32_t oso_idx)
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_idx < m_compile_unit_infos.size())
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[oso_idx]);
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF *
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFileByCompUnitInfo (CompileUnitInfo *comp_unit_info)
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (comp_unit_info->oso_symbol_vendor == NULL)
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *oso_objfile = GetObjectFileByCompUnitInfo (comp_unit_info);
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (oso_objfile)
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            comp_unit_info->oso_symbol_vendor = oso_objfile->GetModule()->GetSymbolVendor();
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          SymbolFileDWARF *oso_dwarf = new SymbolFileDWARF(oso_objfile);
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          comp_unit_info->oso_dwarf_sp.reset (oso_dwarf);
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (comp_unit_info->oso_symbol_vendor)
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
272ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                // Set a a pointer to this class to set our OSO DWARF file know
273ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                // that the DWARF is being used along with a debug map and that
274ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                // it will have the remapped sections that we do below.
275444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton                SymbolFileDWARF *oso_symfile = (SymbolFileDWARF *)comp_unit_info->oso_symbol_vendor->GetSymbolFile();
276444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton                oso_symfile->SetDebugMapSymfile(this);
277444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton                // Set the ID of the symbol file DWARF to the index of the OSO
278444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton                // shifted left by 32 bits to provide a unique prefix for any
279444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton                // UserID's that get created in the symbol file.
280444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton                oso_symfile->SetID (((uint64_t)GetCompUnitInfoIndex(comp_unit_info) + 1ull) << 32ull);
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                comp_unit_info->debug_map_sections_sp.reset(new SectionList);
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Symtab *exe_symtab = m_obj_file->GetSymtab();
2843508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                ModuleSP oso_module_sp (oso_objfile->GetModule());
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Symtab *oso_symtab = oso_objfile->GetSymtab();
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//#define DEBUG_OSO_DMAP    // Do not check in with this defined...
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined(DEBUG_OSO_DMAP)
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StreamFile s(stdout);
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s << "OSO symtab:\n";
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                oso_symtab->Dump(&s, NULL);
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s << "OSO sections before:\n";
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                oso_objfile->GetSectionList()->Dump(&s, NULL, true);
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ///const uint32_t fun_resolve_flags = SymbolContext::Module | eSymbolContextCompUnit | eSymbolContextFunction;
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                //SectionList *oso_sections = oso_objfile->Sections();
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Now we need to make sections that map from zero based object
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // file addresses to where things eneded up in the main executable.
2997c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                uint32_t oso_start_idx = exe_symtab->GetIndexForSymbol (comp_unit_info->oso_symbol);
3007c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                assert (oso_start_idx != UINT32_MAX);
3017c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                oso_start_idx += 1;
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const uint32_t oso_end_idx = comp_unit_info->so_symbol->GetSiblingIndex();
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t sect_id = 0x10000;
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (uint32_t idx = oso_start_idx; idx < oso_end_idx; ++idx)
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    Symbol *exe_symbol = exe_symtab->SymbolAtIndex(idx);
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (exe_symbol)
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
3097c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                        if (exe_symbol->IsDebug() == false)
3107c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                            continue;
3117c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        switch (exe_symbol->GetType())
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
3144fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton                        default:
3154fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton                            break;
3164fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton
3177c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                        case eSymbolTypeCode:
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // For each N_FUN, or function that we run into in the debug map
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // we make a new section that we add to the sections found in the
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // .o file. This new section has the file address set to what the
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // addresses are in the .o file, and the load address is adjusted
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // to match where it ended up in the final executable! We do this
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // before we parse any dwarf info so that when it goes get parsed
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // all section/offset addresses that get registered will resolve
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // correctly to the new addresses in the main executable.
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // First we find the original symbol in the .o file's symbol table
3299d972a4057f2e72a004b5ab70e12cfdc78fd8cbaGreg Clayton                                Symbol *oso_fun_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), eSymbolTypeCode, Symtab::eDebugNo, Symtab::eVisibilityAny);
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (oso_fun_symbol)
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    // If we found the symbol, then we
3333508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                    SectionSP exe_fun_section (exe_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection());
3343508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                    SectionSP oso_fun_section (oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection());
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    if (oso_fun_section)
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    {
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // Now we create a section that we will add as a child of the
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // section in which the .o symbol (the N_FUN) exists.
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // We use the exe_symbol size because the one in the .o file
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // will just be a symbol with no size, and the exe_symbol
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // size will reflect any size changes (ppc has been known to
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // shrink function sizes when it gets rid of jump islands that
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // aren't needed anymore).
3453508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                        SectionSP oso_fun_section_sp (new Section (oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection(),
3463508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                                                        oso_module_sp,                         // Module (the .o file)
3473508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                                                        sect_id++,                          // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs
3483508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                                                        exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), // Name the section the same as the symbol for which is was generated!
3493508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                                                        eSectionTypeDebug,
3503508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                                                        oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetOffset(),  // File VM address offset in the current section
3513508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                                                        exe_symbol->GetByteSize(),          // File size (we need the size from the executable)
3523508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                                                        0, 0, 0));
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        oso_fun_section_sp->SetLinkedLocation (exe_fun_section,
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                               exe_symbol->GetValue().GetFileAddress() - exe_fun_section->GetFileAddress());
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        oso_fun_section->GetChildren().AddSection(oso_fun_section_sp);
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        comp_unit_info->debug_map_sections_sp->AddSection(oso_fun_section_sp);
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    }
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3637c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                        case eSymbolTypeData:
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // For each N_GSYM we remap the address for the global by making
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // a new section that we add to the sections found in the .o file.
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // This new section has the file address set to what the
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // addresses are in the .o file, and the load address is adjusted
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // to match where it ended up in the final executable! We do this
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // before we parse any dwarf info so that when it goes get parsed
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // all section/offset addresses that get registered will resolve
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // correctly to the new addresses in the main executable. We
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // initially set the section size to be 1 byte, but will need to
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // fix up these addresses further after all globals have been
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // parsed to span the gaps, or we can find the global variable
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // sizes from the DWARF info as we are parsing.
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // Next we find the non-stab entry that corresponds to the N_GSYM in the .o file
379a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton                                Symbol *oso_gsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType (exe_symbol->GetMangled().GetName(),
380a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton                                                                                                      eSymbolTypeData,
381a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton                                                                                                      Symtab::eDebugNo,
382a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton                                                                                                      Symtab::eVisibilityAny);
383a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton
384a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton                                if (exe_symbol && oso_gsym_symbol && exe_symbol->GetAddressRangePtr() && oso_gsym_symbol->GetAddressRangePtr())
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    // If we found the symbol, then we
3873508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                    SectionSP exe_gsym_section (exe_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection());
3883508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                    SectionSP oso_gsym_section (oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection());
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    if (oso_gsym_section)
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    {
3913508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                        SectionSP oso_gsym_section_sp (new Section (oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection(),
3923508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                                                                    oso_module_sp,                         // Module (the .o file)
393a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton                                                                                    sect_id++,                          // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs
394a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton                                                                                    exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), // Name the section the same as the symbol for which is was generated!
395a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton                                                                                    eSectionTypeDebug,
396a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton                                                                                    oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetOffset(),  // File VM address offset in the current section
397a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton                                                                                    1,                                   // We don't know the size of the global, just do the main address for now.
398a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton                                                                                    0, 0, 0));
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        oso_gsym_section_sp->SetLinkedLocation (exe_gsym_section,
401a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton                                                                                exe_symbol->GetValue().GetFileAddress() - exe_gsym_section->GetFileAddress());
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        oso_gsym_section->GetChildren().AddSection(oso_gsym_section_sp);
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        comp_unit_info->debug_map_sections_sp->AddSection(oso_gsym_section_sp);
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    }
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined(DEBUG_OSO_DMAP)
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s << "OSO sections after:\n";
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                oso_objfile->GetSectionList()->Dump(&s, NULL, true);
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (comp_unit_info->oso_symbol_vendor)
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return (SymbolFileDWARF *)comp_unit_info->oso_symbol_vendor->GetSymbolFile();
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
424d0b7cfa22722fdaf4111a61d6eeb02a587710e16Sean CallananSymbolFileDWARFDebugMap::CalculateAbilities ()
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // In order to get the abilities of this plug-in, we look at the list of
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // N_OSO entries (object files) from the symbol table and make sure that
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // these files exist and also contain valid DWARF. If we get any of that
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // then we return the abilities of the first N_OSO's DWARF.
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t oso_index_count = GetNumCompileUnits();
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_index_count > 0)
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const uint32_t dwarf_abilities = SymbolFile::CompileUnits |
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::Functions |
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::Blocks |
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::GlobalVariables |
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::LocalVariables |
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::VariableTypes |
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::LineTables;
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (uint32_t oso_idx=0; oso_idx<oso_index_count; ++oso_idx)
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (oso_dwarf)
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t oso_abilities = oso_dwarf->GetAbilities();
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if ((oso_abilities & dwarf_abilities) == dwarf_abilities)
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return oso_abilities;
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetNumCompileUnits()
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    InitOSO ();
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_compile_unit_infos.size();
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitAtIndex(uint32_t cu_idx)
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompUnitSP comp_unit_sp;
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t cu_count = GetNumCompileUnits();
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cu_idx < cu_count)
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL)
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (cu_idx);
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (oso_dwarf)
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // There is only one compile unit for N_OSO entry right now, so
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // it will always exist at index zero.
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_compile_unit_infos[cu_idx].oso_compile_unit_sp = m_compile_unit_infos[cu_idx].oso_symbol_vendor->GetCompileUnitAtIndex (0);
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL)
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We weren't able to get the DWARF for this N_OSO entry (the
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // .o file may be missing or not at the specified path), make
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // one up as best we can from the debug map. We set the uid
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // of the compile unit to the symbol index with the MSBit set
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // so that it doesn't collide with any uid values from the DWARF
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Symbol *so_symbol = m_compile_unit_infos[cu_idx].so_symbol;
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (so_symbol)
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_compile_unit_infos[cu_idx].oso_compile_unit_sp.reset(new CompileUnit (m_obj_file->GetModule(),
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                            NULL,
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                            so_symbol->GetMangled().GetName().AsCString(),
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                            cu_idx,
4969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                                                            eLanguageTypeUnknown));
497ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton
498ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                    // Let our symbol vendor know about this compile unit
499ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                    m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex (m_compile_unit_infos[cu_idx].oso_compile_unit_sp,
500ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                                                                                       cu_idx);
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        comp_unit_sp = m_compile_unit_infos[cu_idx].oso_compile_unit_sp;
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return comp_unit_sp;
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CompileUnitInfo *
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetCompUnitInfo (const SymbolContext& sc)
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t cu_count = GetNumCompileUnits();
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (uint32_t i=0; i<cu_count; ++i)
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (sc.comp_unit == m_compile_unit_infos[i].oso_compile_unit_sp.get())
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return &m_compile_unit_infos[i];
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitFunctions (const SymbolContext& sc)
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseCompileUnitFunctions (sc);
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitLineTable (const SymbolContext& sc)
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseCompileUnitLineTable (sc);
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList &support_files)
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseCompileUnitSupportFiles (sc, support_files);
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseFunctionBlocks (const SymbolContext& sc)
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseFunctionBlocks (sc);
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseTypes (const SymbolContext& sc)
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseTypes (sc);
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseVariablesForContext (const SymbolContext& sc)
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseTypes (sc);
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerType*
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveTypeUID(lldb::user_id_t type_uid)
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
584444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    const uint64_t oso_idx = GetOSOIndexFromUserID (type_uid);
585444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
586444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    if (oso_dwarf)
587444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton        oso_dwarf->ResolveTypeUID (type_uid);
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
591462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonlldb::clang_type_t
592444e35b5fdf15a25a427285650f06f1390e62c75Greg ClaytonSymbolFileDWARFDebugMap::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type)
593462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{
594462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    // We have a struct/union/class/enum that needs to be fully resolved.
595462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return NULL;
596462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton}
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveSymbolContext (const Address& exe_so_addr, uint32_t resolve_scope, SymbolContext& sc)
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t resolved_flags = 0;
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Symtab* symtab = m_obj_file->GetSymtab();
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symtab)
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const addr_t exe_file_addr = exe_so_addr.GetFileAddress();
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sc.symbol = symtab->FindSymbolContainingFileAddress (exe_file_addr, &m_func_indexes[0], m_func_indexes.size());
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (sc.symbol != NULL)
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolved_flags |= eSymbolContextSymbol;
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t oso_idx = 0;
6137c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithID (sc.symbol->GetID(), &oso_idx);
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (comp_unit_info)
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ObjectFile *oso_objfile = GetObjectFileByOSOIndex (oso_idx);
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (oso_dwarf && oso_objfile)
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    SectionList *oso_section_list = oso_objfile->GetSectionList();
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
622178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                    SectionSP oso_symbol_section_sp (oso_section_list->FindSectionContainingLinkedFileAddress (exe_file_addr, UINT32_MAX));
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
624178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                    if (oso_symbol_section_sp)
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
626178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                        const addr_t linked_file_addr = oso_symbol_section_sp->GetLinkedFileAddress();
6273508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                        Address oso_so_addr (oso_symbol_section_sp, exe_file_addr - linked_file_addr);
628178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                        if (oso_so_addr.IsSectionOffset())
629178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                            resolved_flags |= oso_dwarf->ResolveSymbolContext (oso_so_addr, resolve_scope, sc);
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return resolved_flags;
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveSymbolContext (const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t initial = sc_list.GetSize();
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t cu_count = GetNumCompileUnits();
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FileSpec so_file_spec;
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (uint32_t i=0; i<cu_count; ++i)
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (GetFileSpecForSO (i, so_file_spec))
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // By passing false to the comparison we will be able to match
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // and files given a filename only. If both file_spec and
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // so_file_spec have directories, we will still do a full match.
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (FileSpec::Compare (file_spec, so_file_spec, false) == 0)
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (i);
656281700b2216e6b2aa7b09023e427130de473e3d9Jim Ingham                if (oso_dwarf)
657281700b2216e6b2aa7b09023e427130de473e3d9Jim Ingham                    oso_dwarf->ResolveSymbolContext(file_spec, line, check_inlines, resolve_scope, sc_list);
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial;
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::PrivateFindGlobalVariables
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString &name,
6680fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan    const ClangNamespaceDecl *namespace_decl,
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const std::vector<uint32_t> &indexes,   // Indexes into the symbol table that match "name"
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t max_matches,
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    VariableList& variables
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t original_size = variables.GetSize();
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t match_count = indexes.size();
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (size_t i=0; i<match_count; ++i)
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t oso_idx;
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithIndex (indexes[i], &oso_idx);
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (comp_unit_info)
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (oso_dwarf)
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
6850fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan                if (oso_dwarf->FindGlobalVariables(name, namespace_decl, true, max_matches, variables))
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (variables.GetSize() > max_matches)
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        break;
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return variables.GetSize() - original_size;
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
6950fcec13c6639ab49216fa9447b25888b7bc9ff59Sean CallananSymbolFileDWARFDebugMap::FindGlobalVariables (const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables)
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If we aren't appending the results to this list, then clear the list
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!append)
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        variables.Clear();
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Remember how many variables are in the list before we search in case
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we are appending the results to a variable list.
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t original_size = variables.GetSize();
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
706e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    uint32_t total_matches = 0;
707e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    SymbolFileDWARF *oso_dwarf;
708e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7100fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan        const uint32_t oso_matches = oso_dwarf->FindGlobalVariables (name,
7110fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan                                                                     namespace_decl,
712e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                                                                     true,
713e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                                                                     max_matches,
714e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                                                                     variables);
715e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton        if (oso_matches > 0)
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
717e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            total_matches += oso_matches;
718e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton
719e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            // Are we getting all matches?
720e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            if (max_matches == UINT32_MAX)
721e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                continue;   // Yep, continue getting everything
722e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton
723e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            // If we have found enough matches, lets get out
724e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            if (max_matches >= total_matches)
725e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                break;
726e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton
727e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            // Update the max matches for any subsequent calls to find globals
728e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            // in any other object files with DWARF
729e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            max_matches -= oso_matches;
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Return the number of variable that were appended to the list
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return variables.GetSize() - original_size;
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::FindGlobalVariables (const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
740e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    // If we aren't appending the results to this list, then clear the list
741e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    if (!append)
742e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton        variables.Clear();
743e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton
744e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    // Remember how many variables are in the list before we search in case
745e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    // we are appending the results to a variable list.
746e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    const uint32_t original_size = variables.GetSize();
747e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton
748e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    uint32_t total_matches = 0;
749e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    SymbolFileDWARF *oso_dwarf;
750e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
751e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    {
752e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton        const uint32_t oso_matches = oso_dwarf->FindGlobalVariables (regex,
753e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                                                                     true,
754e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                                                                     max_matches,
755e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                                                                     variables);
756e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton        if (oso_matches > 0)
757e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton        {
758e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            total_matches += oso_matches;
759e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton
760e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            // Are we getting all matches?
761e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            if (max_matches == UINT32_MAX)
762e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                continue;   // Yep, continue getting everything
763e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton
764e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            // If we have found enough matches, lets get out
765e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            if (max_matches >= total_matches)
766e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                break;
767e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton
768e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            // Update the max matches for any subsequent calls to find globals
769e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            // in any other object files with DWARF
770e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            max_matches -= oso_matches;
771e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton        }
772e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    }
773e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    // Return the number of variable that were appended to the list
774e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    return variables.GetSize() - original_size;
77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
7797c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::SymbolContainsSymbolWithIndex (uint32_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info)
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t symbol_idx = *symbol_idx_ptr;
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7837c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    if (symbol_idx < comp_unit_info->first_symbol_index)
7847c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton        return -1;
7857c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
7867c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    if (symbol_idx <= comp_unit_info->last_symbol_index)
7877c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton        return 0;
7887c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
7897c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    return 1;
7907c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton}
7917c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
7927c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
7937c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Claytonint
7947c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::SymbolContainsSymbolWithID (user_id_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info)
7957c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton{
7967c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    const user_id_t symbol_id = *symbol_idx_ptr;
7977c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
7987c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    if (symbol_id < comp_unit_info->so_symbol->GetID())
79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return -1;
80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8017c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    if (symbol_id <= comp_unit_info->last_symbol->GetID())
80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 1;
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CompileUnitInfo*
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithIndex (uint32_t symbol_idx, uint32_t *oso_idx_ptr)
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t oso_index_count = m_compile_unit_infos.size();
81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompileUnitInfo *comp_unit_info = NULL;
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_index_count)
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
815b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        comp_unit_info = (CompileUnitInfo*)bsearch(&symbol_idx,
816b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                   &m_compile_unit_infos[0],
817b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                   m_compile_unit_infos.size(),
818b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                   sizeof(CompileUnitInfo),
819b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                   (ComparisonFunction)SymbolContainsSymbolWithIndex);
82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_idx_ptr)
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (comp_unit_info != NULL)
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0];
82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *oso_idx_ptr = UINT32_MAX;
82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return comp_unit_info;
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8327c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::CompileUnitInfo*
8337c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithID (user_id_t symbol_id, uint32_t *oso_idx_ptr)
8347c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton{
8357c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    const uint32_t oso_index_count = m_compile_unit_infos.size();
8367c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    CompileUnitInfo *comp_unit_info = NULL;
8377c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    if (oso_index_count)
8387c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    {
839b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        comp_unit_info = (CompileUnitInfo*)::bsearch (&symbol_id,
840b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                      &m_compile_unit_infos[0],
841b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                      m_compile_unit_infos.size(),
842b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                      sizeof(CompileUnitInfo),
843b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                      (ComparisonFunction)SymbolContainsSymbolWithID);
8447c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    }
8457c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
8467c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    if (oso_idx_ptr)
8477c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    {
8487c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton        if (comp_unit_info != NULL)
8497c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0];
8507c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton        else
8517c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            *oso_idx_ptr = UINT32_MAX;
8527c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    }
8537c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    return comp_unit_info;
8547c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton}
8557c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
8567c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
85788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Claytonstatic void
8583508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonRemoveFunctionsWithModuleNotEqualTo (const ModuleSP &module_sp, SymbolContextList &sc_list, uint32_t start_idx)
85988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton{
86088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // We found functions in .o files. Not all functions in the .o files
86188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // will have made it into the final output file. The ones that did
86288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // make it into the final output file will have a section whose module
86388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // matches the module from the ObjectFile for this SymbolFile. When
86488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // the modules don't match, then we have something that was in a
86588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // .o file, but doesn't map to anything in the final executable.
86688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    uint32_t i=start_idx;
86788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    while (i < sc_list.GetSize())
86888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    {
86988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        SymbolContext sc;
87088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        sc_list.GetContextAtIndex(i, sc);
87188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        if (sc.function)
87288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        {
8733508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            const SectionSP section_sp (sc.function->GetAddressRange().GetBaseAddress().GetSection());
8743508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            if (section_sp->GetModule() != module_sp)
87588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton            {
87688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton                sc_list.RemoveContextAtIndex(i);
87788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton                continue;
87888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton            }
87988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        }
88088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        ++i;
88188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    }
88288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton}
88388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
885302d78c71902398ce1f422bd09216dd53a6abb88Sean CallananSymbolFileDWARFDebugMap::FindFunctions(const ConstString &name, const ClangNamespaceDecl *namespace_decl, uint32_t name_type_mask, bool include_inlines, bool append, SymbolContextList& sc_list)
88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__,
88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        "SymbolFileDWARFDebugMap::FindFunctions (name = %s)",
88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        name.GetCString());
89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t initial_size = 0;
89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (append)
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        initial_size = sc_list.GetSize();
89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sc_list.Clear();
89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8977241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    uint32_t oso_idx = 0;
8987241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    SymbolFileDWARF *oso_dwarf;
8997241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL)
90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
90188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        uint32_t sc_idx = sc_list.GetSize();
902302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan        if (oso_dwarf->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, true, sc_list))
90388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        {
90488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton            RemoveFunctionsWithModuleNotEqualTo (m_obj_file->GetModule(), sc_list, sc_idx);
90588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        }
90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
913302d78c71902398ce1f422bd09216dd53a6abb88Sean CallananSymbolFileDWARFDebugMap::FindFunctions (const RegularExpression& regex, bool include_inlines, bool append, SymbolContextList& sc_list)
91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__,
91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        "SymbolFileDWARFDebugMap::FindFunctions (regex = '%s')",
91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        regex.GetText());
91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9197241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    uint32_t initial_size = 0;
9207241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    if (append)
9217241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton        initial_size = sc_list.GetSize();
9227241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    else
9237241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton        sc_list.Clear();
9247241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton
9257241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    uint32_t oso_idx = 0;
9267241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    SymbolFileDWARF *oso_dwarf;
9277241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL)
9287241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    {
92988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        uint32_t sc_idx = sc_list.GetSize();
93088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton
931302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan        if (oso_dwarf->FindFunctions(regex, include_inlines, true, sc_list))
93288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        {
93388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton            RemoveFunctionsWithModuleNotEqualTo (m_obj_file->GetModule(), sc_list, sc_idx);
93488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        }
9357241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    }
9367241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton
9377241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    return sc_list.GetSize() - initial_size;
93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
94095e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg ClaytonTypeSP
94177917228890a15d40ec6dd28c5865dd1b7895053Greg ClaytonSymbolFileDWARFDebugMap::FindDefinitionTypeForDIE (DWARFCompileUnit* cu,
94277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton                                                   const DWARFDebugInfoEntry *die,
94377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton                                                   const ConstString &type_name)
94495e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton{
94595e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    TypeSP type_sp;
94695e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    SymbolFileDWARF *oso_dwarf;
94795e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
94895e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    {
94995e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton        type_sp = oso_dwarf->FindDefinitionTypeForDIE (cu, die, type_name);
95095e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton        if (type_sp)
95195e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton            break;
95295e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    }
95395e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    return type_sp;
95495e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton}
955960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
95677917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton
957e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton
958e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Claytonbool
959e6b976d3f1c42f18c85c87cb179954af7df5a542Greg ClaytonSymbolFileDWARFDebugMap::Supports_DW_AT_APPLE_objc_complete_type (SymbolFileDWARF *skip_dwarf_oso)
960e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton{
961e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolCalculate)
962e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    {
963e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolNo;
964e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        SymbolFileDWARF *oso_dwarf;
965e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
966e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        {
967e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton            if (skip_dwarf_oso != oso_dwarf && oso_dwarf->Supports_DW_AT_APPLE_objc_complete_type(NULL))
968e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton            {
969e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton                m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes;
970e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton                break;
971e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton            }
972e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        }
973e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    }
974e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    return m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolYes;
975e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton}
976e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton
97777917228890a15d40ec6dd28c5865dd1b7895053Greg ClaytonTypeSP
978e6b976d3f1c42f18c85c87cb179954af7df5a542Greg ClaytonSymbolFileDWARFDebugMap::FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry *die,
979e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton                                                               const ConstString &type_name,
980e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton                                                               bool must_be_implementation)
98177917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton{
98277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton    TypeSP type_sp;
98377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton    SymbolFileDWARF *oso_dwarf;
98477917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton    for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
98577917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton    {
986e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        type_sp = oso_dwarf->FindCompleteObjCDefinitionTypeForDIE (die, type_name, must_be_implementation);
98777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton        if (type_sp)
98877917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton            break;
98977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton    }
99077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton    return type_sp;
99177917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton}
99277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton
993960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Claytonuint32_t
9941924e2408687e0ee41976010c6b9410bdd01270dGreg ClaytonSymbolFileDWARFDebugMap::FindTypes
9951924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton(
9961924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    const SymbolContext& sc,
9970fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan    const ConstString &name,
9980fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan    const ClangNamespaceDecl *namespace_decl,
9991924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    bool append,
10001924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    uint32_t max_matches,
10011924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    TypeList& types
10021924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton)
1003960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
1004960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton    if (!append)
1005960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        types.Clear();
10061924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton
10071924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    const uint32_t initial_types_size = types.GetSize();
10081924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    SymbolFileDWARF *oso_dwarf;
10091924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton
10101924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    if (sc.comp_unit)
10111924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    {
10121924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton        oso_dwarf = GetSymbolFile (sc);
10131924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton        if (oso_dwarf)
10140fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan            return oso_dwarf->FindTypes (sc, name, namespace_decl, append, max_matches, types);
10151924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    }
10161924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    else
10171924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    {
10181924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton        uint32_t oso_idx = 0;
10191924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton        while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL)
10200fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan            oso_dwarf->FindTypes (sc, name, namespace_decl, append, max_matches, types);
10211924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    }
10221924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton
10231924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    return types.GetSize() - initial_types_size;
1024960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
1025960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t
102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//SymbolFileDWARFDebugMap::FindTypes (const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, lldb::user_id_t udt_uid, TypeList& types)
102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (oso_dwarf)
103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return oso_dwarf->FindTypes (sc, regex, append, max_matches, encoding, udt_uid, types);
103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return 0;
103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1036d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton
10376916e358c9725b75ed91f31236c147f26c9af10eGreg ClaytonClangNamespaceDecl
1038d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg ClaytonSymbolFileDWARFDebugMap::FindNamespace (const lldb_private::SymbolContext& sc,
10390fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan                                        const lldb_private::ConstString &name,
10400fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan                                        const ClangNamespaceDecl *parent_namespace_decl)
1041d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton{
10426916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    ClangNamespaceDecl matching_namespace;
1043d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    SymbolFileDWARF *oso_dwarf;
1044d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton
1045d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    if (sc.comp_unit)
1046d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    {
1047d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton        oso_dwarf = GetSymbolFile (sc);
1048d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton        if (oso_dwarf)
10490fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan            matching_namespace = oso_dwarf->FindNamespace (sc, name, parent_namespace_decl);
1050d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    }
1051d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    else
1052d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    {
1053d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton        for (uint32_t oso_idx = 0;
1054d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton             ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL);
1055d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton             ++oso_idx)
1056d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton        {
10570fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan            matching_namespace = oso_dwarf->FindNamespace (sc, name, parent_namespace_decl);
1058d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton
1059d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton            if (matching_namespace)
1060d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton                break;
1061d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton        }
1062d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    }
1063d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton
1064d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    return matching_namespace;
1065d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton}
1066d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton
106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
106824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// PluginInterface protocol
106924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginName()
107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return "SymbolFileDWARFDebugMap";
107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetShortPluginName()
107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetPluginNameStatic();
108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginVersion()
108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 1;
108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
1089ad60bf486dee699dd524225b63271ddc5b6329b9Greg ClaytonSymbolFileDWARFDebugMap::SetCompileUnit (SymbolFileDWARF *oso_dwarf, const CompUnitSP &cu_sp)
1090ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton{
1091ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    const uint32_t cu_count = GetNumCompileUnits();
1092ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    for (uint32_t i=0; i<cu_count; ++i)
1093ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    {
1094ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        if (m_compile_unit_infos[i].oso_symbol_vendor &&
1095ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            m_compile_unit_infos[i].oso_symbol_vendor->GetSymbolFile() == oso_dwarf)
1096ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        {
1097ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            if (m_compile_unit_infos[i].oso_compile_unit_sp)
1098ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            {
1099ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                assert (m_compile_unit_infos[i].oso_compile_unit_sp.get() == cu_sp.get());
1100ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            }
1101ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            else
1102ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            {
1103ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                m_compile_unit_infos[i].oso_compile_unit_sp = cu_sp;
1104ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            }
1105ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        }
1106ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    }
1107ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton}
1108ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton
1109b01000fd063629facd45044f137446fb748ee179Greg Clayton
1110b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid
1111b01000fd063629facd45044f137446fb748ee179Greg ClaytonSymbolFileDWARFDebugMap::CompleteTagDecl (void *baton, clang::TagDecl *decl)
1112b01000fd063629facd45044f137446fb748ee179Greg Clayton{
1113b01000fd063629facd45044f137446fb748ee179Greg Clayton    SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton;
1114b01000fd063629facd45044f137446fb748ee179Greg Clayton    clang_type_t clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl);
1115b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type)
1116b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
1117b01000fd063629facd45044f137446fb748ee179Greg Clayton        SymbolFileDWARF *oso_dwarf;
1118b01000fd063629facd45044f137446fb748ee179Greg Clayton
1119b01000fd063629facd45044f137446fb748ee179Greg Clayton        for (uint32_t oso_idx = 0; ((oso_dwarf = symbol_file_dwarf->GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
1120b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
1121b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (oso_dwarf->HasForwardDeclForClangType (clang_type))
1122b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
1123b01000fd063629facd45044f137446fb748ee179Greg Clayton                oso_dwarf->ResolveClangOpaqueTypeDefinition (clang_type);
1124b01000fd063629facd45044f137446fb748ee179Greg Clayton                return;
1125b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
1126b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
1127b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
1128b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1129b01000fd063629facd45044f137446fb748ee179Greg Clayton
1130b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid
1131b01000fd063629facd45044f137446fb748ee179Greg ClaytonSymbolFileDWARFDebugMap::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl)
1132b01000fd063629facd45044f137446fb748ee179Greg Clayton{
1133b01000fd063629facd45044f137446fb748ee179Greg Clayton    SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton;
1134b01000fd063629facd45044f137446fb748ee179Greg Clayton    clang_type_t clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl);
1135b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type)
1136b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
1137b01000fd063629facd45044f137446fb748ee179Greg Clayton        SymbolFileDWARF *oso_dwarf;
1138b01000fd063629facd45044f137446fb748ee179Greg Clayton
1139b01000fd063629facd45044f137446fb748ee179Greg Clayton        for (uint32_t oso_idx = 0; ((oso_dwarf = symbol_file_dwarf->GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
1140b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
1141b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (oso_dwarf->HasForwardDeclForClangType (clang_type))
1142b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
1143b01000fd063629facd45044f137446fb748ee179Greg Clayton                oso_dwarf->ResolveClangOpaqueTypeDefinition (clang_type);
1144b01000fd063629facd45044f137446fb748ee179Greg Clayton                return;
1145b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
1146b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
1147b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
1148b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1149b01000fd063629facd45044f137446fb748ee179Greg Clayton
11503fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Claytonbool
11513fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg ClaytonSymbolFileDWARFDebugMap::LayoutRecordType (void *baton,
11523fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                                           const clang::RecordDecl *record_decl,
11533fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                                           uint64_t &size,
11543fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                                           uint64_t &alignment,
11553fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                                           llvm::DenseMap <const clang::FieldDecl *, uint64_t> &field_offsets,
11563fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                                           llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
11573fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                                           llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets)
11583fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton{
11593fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton;
11603fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    SymbolFileDWARF *oso_dwarf;
11613fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    for (uint32_t oso_idx = 0; ((oso_dwarf = symbol_file_dwarf->GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
11623fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    {
11633fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton        if (oso_dwarf->LayoutRecordType (record_decl, size, alignment, field_offsets, base_offsets, vbase_offsets))
11643fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton            return true;
11653fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    }
11663fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    return false;
11673fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton}
11683fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton
11693fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton
11703fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton
1171444e35b5fdf15a25a427285650f06f1390e62c75Greg Claytonclang::DeclContext*
1172444e35b5fdf15a25a427285650f06f1390e62c75Greg ClaytonSymbolFileDWARFDebugMap::GetClangDeclContextContainingTypeUID (lldb::user_id_t type_uid)
1173444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton{
1174444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    const uint64_t oso_idx = GetOSOIndexFromUserID (type_uid);
1175444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
1176444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    if (oso_dwarf)
1177444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton        return oso_dwarf->GetClangDeclContextContainingTypeUID (type_uid);
1178444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    return NULL;
1179444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton}
1180444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton
1181444e35b5fdf15a25a427285650f06f1390e62c75Greg Claytonclang::DeclContext*
1182444e35b5fdf15a25a427285650f06f1390e62c75Greg ClaytonSymbolFileDWARFDebugMap::GetClangDeclContextForTypeUID (const lldb_private::SymbolContext &sc, lldb::user_id_t type_uid)
1183444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton{
1184444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    const uint64_t oso_idx = GetOSOIndexFromUserID (type_uid);
1185444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
1186444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    if (oso_dwarf)
1187444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton        return oso_dwarf->GetClangDeclContextForTypeUID (sc, type_uid);
1188444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    return NULL;
1189444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton}
1190444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton
1191444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton
1192