SymbolFileDWARFDebugMap.cpp revision e98ac25604b3d967158917f6fdd5289b3096fd80
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"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "SymbolFileDWARF.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::Initialize()
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PluginManager::RegisterPlugin (GetPluginNameStatic(),
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                   GetPluginDescriptionStatic(),
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                   CreateInstance);
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::Terminate()
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PluginManager::UnregisterPlugin (CreateInstance);
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginNameStatic()
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return "symbol-file.dwarf2-debugmap";
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginDescriptionStatic()
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return "DWARF and DWARF3 debug symbol file reader (debug map).";
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFile*
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CreateInstance (ObjectFile* obj_file)
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return new SymbolFileDWARFDebugMap (obj_file);
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::SymbolFileDWARFDebugMap (ObjectFile* ofile) :
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFile(ofile),
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_flags(),
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_compile_unit_infos(),
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_func_indexes(),
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_glob_indexes()
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::~SymbolFileDWARFDebugMap()
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75e98ac25604b3d967158917f6fdd5289b3096fd80Greg Claytonlldb_private::ClangASTContext &
76e98ac25604b3d967158917f6fdd5289b3096fd80Greg ClaytonSymbolFileDWARFDebugMap::GetClangASTContext ()
77e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton{
78e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton    return GetTypeList()->GetClangASTContext();
79e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton}
80e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::InitOSO ()
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_flags.test(kHaveInitializedOSOs))
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_flags.set(kHaveInitializedOSOs);
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // In order to get the abilities of this plug-in, we look at the list of
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // N_OSO entries (object files) from the symbol table and make sure that
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // these files exist and also contain valid DWARF. If we get any of that
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // then we return the abilities of the first N_OSO's DWARF.
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Symtab* symtab = m_obj_file->GetSymtab();
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symtab)
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        //StreamFile s(0, 4, eByteOrderHost, stdout);
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::vector<uint32_t> oso_indexes;
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const uint32_t oso_index_count = symtab->AppendSymbolIndexesWithType(eSymbolTypeObjectFile, oso_indexes);
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1007c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton        symtab->AppendSymbolIndexesWithType (eSymbolTypeCode, Symtab::eDebugYes, Symtab::eVisibilityAny, m_func_indexes);
1017c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton        symtab->AppendSymbolIndexesWithType (eSymbolTypeData, Symtab::eDebugYes, Symtab::eVisibilityAny, m_glob_indexes);
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symtab->SortSymbolIndexesByValue(m_func_indexes, true);
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symtab->SortSymbolIndexesByValue(m_glob_indexes, true);
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (oso_index_count > 0)
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_compile_unit_infos.resize(oso_index_count);
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          s.Printf("%s N_OSO symbols:\n", __PRETTY_FUNCTION__);
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          symtab->Dump(&s, oso_indexes);
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (uint32_t i=0; i<oso_index_count; ++i)
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_compile_unit_infos[i].so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 1);
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (m_compile_unit_infos[i].so_symbol->GetSiblingIndex() == 0)
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_compile_unit_infos[i].so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 2);
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_compile_unit_infos[i].oso_symbol = symtab->SymbolAtIndex(oso_indexes[i]);
1187c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                uint32_t sibling_idx = m_compile_unit_infos[i].so_symbol->GetSiblingIndex();
1197c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                assert (sibling_idx != 0);
1207c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                assert (sibling_idx > i + 1);
1217c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                m_compile_unit_infos[i].last_symbol = symtab->SymbolAtIndex (sibling_idx - 1);
1227c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                m_compile_unit_infos[i].first_symbol_index = symtab->GetIndexForSymbol(m_compile_unit_infos[i].so_symbol);
1237c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                m_compile_unit_infos[i].last_symbol_index = symtab->GetIndexForSymbol(m_compile_unit_infos[i].last_symbol);
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule *
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetModuleByOSOIndex (uint32_t oso_idx)
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t cu_count = GetNumCompileUnits();
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_idx < cu_count)
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetModuleByCompUnitInfo (&m_compile_unit_infos[oso_idx]);
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule *
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetModuleByCompUnitInfo (CompileUnitInfo *comp_unit_info)
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (comp_unit_info->oso_module_sp.get() == NULL)
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symbol *oso_symbol = comp_unit_info->oso_symbol;
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (oso_symbol)
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
146537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton            FileSpec oso_file_spec(oso_symbol->GetMangled().GetName().AsCString(), true);
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ModuleList::GetSharedModule (oso_file_spec,
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         m_obj_file->GetModule()->GetArchitecture(),
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         NULL,  // UUID pointer
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         NULL,  // object name
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         0,     // object offset
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         comp_unit_info->oso_module_sp,
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         NULL,
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         NULL);
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            //comp_unit_info->oso_module_sp.reset(new Module (oso_file_spec, m_obj_file->GetModule()->GetArchitecture()));
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return comp_unit_info->oso_module_sp.get();
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetFileSpecForSO (uint32_t oso_idx, FileSpec &file_spec)
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_idx < m_compile_unit_infos.size())
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!m_compile_unit_infos[oso_idx].so_file)
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_compile_unit_infos[oso_idx].so_symbol == NULL)
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::string so_path (m_compile_unit_infos[oso_idx].so_symbol->GetMangled().GetName().AsCString());
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_compile_unit_infos[oso_idx].so_symbol[1].GetType() == eSymbolTypeSourceFile)
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                so_path += m_compile_unit_infos[oso_idx].so_symbol[1].GetMangled().GetName().AsCString();
177537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton            m_compile_unit_infos[oso_idx].so_file.SetFile(so_path.c_str(), true);
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        file_spec = m_compile_unit_infos[oso_idx].so_file;
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile *
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetObjectFileByOSOIndex (uint32_t oso_idx)
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Module *oso_module = GetModuleByOSOIndex (oso_idx);
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_module)
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_module->GetObjectFile();
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF *
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFile (const SymbolContext& sc)
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompileUnitInfo *comp_unit_info = GetCompUnitInfo (sc);
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (comp_unit_info)
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetSymbolFileByCompUnitInfo (comp_unit_info);
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile *
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetObjectFileByCompUnitInfo (CompileUnitInfo *comp_unit_info)
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Module *oso_module = GetModuleByCompUnitInfo (comp_unit_info);
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_module)
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_module->GetObjectFile();
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF *
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFileByOSOIndex (uint32_t oso_idx)
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_idx < m_compile_unit_infos.size())
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[oso_idx]);
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF *
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFileByCompUnitInfo (CompileUnitInfo *comp_unit_info)
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (comp_unit_info->oso_symbol_vendor == NULL)
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *oso_objfile = GetObjectFileByCompUnitInfo (comp_unit_info);
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (oso_objfile)
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            comp_unit_info->oso_symbol_vendor = oso_objfile->GetModule()->GetSymbolVendor();
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          SymbolFileDWARF *oso_dwarf = new SymbolFileDWARF(oso_objfile);
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          comp_unit_info->oso_dwarf_sp.reset (oso_dwarf);
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (comp_unit_info->oso_symbol_vendor)
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
236ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                // Set a a pointer to this class to set our OSO DWARF file know
237ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                // that the DWARF is being used along with a debug map and that
238ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                // it will have the remapped sections that we do below.
239ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                ((SymbolFileDWARF *)comp_unit_info->oso_symbol_vendor->GetSymbolFile())->SetDebugMapSymfile(this);
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                comp_unit_info->debug_map_sections_sp.reset(new SectionList);
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Symtab *exe_symtab = m_obj_file->GetSymtab();
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Module *oso_module = oso_objfile->GetModule();
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Symtab *oso_symtab = oso_objfile->GetSymtab();
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//#define DEBUG_OSO_DMAP    // Do not check in with this defined...
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined(DEBUG_OSO_DMAP)
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StreamFile s(stdout);
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s << "OSO symtab:\n";
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                oso_symtab->Dump(&s, NULL);
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s << "OSO sections before:\n";
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                oso_objfile->GetSectionList()->Dump(&s, NULL, true);
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ///const uint32_t fun_resolve_flags = SymbolContext::Module | eSymbolContextCompUnit | eSymbolContextFunction;
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                //SectionList *oso_sections = oso_objfile->Sections();
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Now we need to make sections that map from zero based object
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // file addresses to where things eneded up in the main executable.
2587c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                uint32_t oso_start_idx = exe_symtab->GetIndexForSymbol (comp_unit_info->oso_symbol);
2597c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                assert (oso_start_idx != UINT32_MAX);
2607c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                oso_start_idx += 1;
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const uint32_t oso_end_idx = comp_unit_info->so_symbol->GetSiblingIndex();
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t sect_id = 0x10000;
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (uint32_t idx = oso_start_idx; idx < oso_end_idx; ++idx)
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    Symbol *exe_symbol = exe_symtab->SymbolAtIndex(idx);
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (exe_symbol)
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
2687c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                        if (exe_symbol->IsDebug() == false)
2697c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                            continue;
2707c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        switch (exe_symbol->GetType())
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
2737c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                        case eSymbolTypeCode:
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // For each N_FUN, or function that we run into in the debug map
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // we make a new section that we add to the sections found in the
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // .o file. This new section has the file address set to what the
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // addresses are in the .o file, and the load address is adjusted
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // to match where it ended up in the final executable! We do this
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // before we parse any dwarf info so that when it goes get parsed
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // all section/offset addresses that get registered will resolve
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // correctly to the new addresses in the main executable.
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // First we find the original symbol in the .o file's symbol table
2857c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                                Symbol *oso_fun_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(), eSymbolTypeCode, Symtab::eDebugNo, Symtab::eVisibilityAny);
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (oso_fun_symbol)
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    // If we found the symbol, then we
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    Section* exe_fun_section = const_cast<Section *>(exe_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection());
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    Section* oso_fun_section = const_cast<Section *>(oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection());
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    if (oso_fun_section)
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    {
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // Now we create a section that we will add as a child of the
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // section in which the .o symbol (the N_FUN) exists.
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // We use the exe_symbol size because the one in the .o file
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // will just be a symbol with no size, and the exe_symbol
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // size will reflect any size changes (ppc has been known to
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // shrink function sizes when it gets rid of jump islands that
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // aren't needed anymore).
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SectionSP oso_fun_section_sp (new Section (const_cast<Section *>(oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()),
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   oso_module,                         // Module (the .o file)
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   sect_id++,                          // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   exe_symbol->GetMangled().GetName(), // Name the section the same as the symbol for which is was generated!
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   eSectionTypeDebug,
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetOffset(),  // File VM address offset in the current section
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   exe_symbol->GetByteSize(),          // File size (we need the size from the executable)
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   0, 0, 0));
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        oso_fun_section_sp->SetLinkedLocation (exe_fun_section,
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                               exe_symbol->GetValue().GetFileAddress() - exe_fun_section->GetFileAddress());
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        oso_fun_section->GetChildren().AddSection(oso_fun_section_sp);
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        comp_unit_info->debug_map_sections_sp->AddSection(oso_fun_section_sp);
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    }
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3197c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                        case eSymbolTypeData:
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // For each N_GSYM we remap the address for the global by making
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // a new section that we add to the sections found in the .o file.
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // This new section has the file address set to what the
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // addresses are in the .o file, and the load address is adjusted
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // to match where it ended up in the final executable! We do this
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // before we parse any dwarf info so that when it goes get parsed
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // all section/offset addresses that get registered will resolve
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // correctly to the new addresses in the main executable. We
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // initially set the section size to be 1 byte, but will need to
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // fix up these addresses further after all globals have been
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // parsed to span the gaps, or we can find the global variable
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // sizes from the DWARF info as we are parsing.
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if 0
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // First we find the non-stab entry that corresponds to the N_GSYM in the executable
3367c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                                Symbol *exe_gsym_symbol = exe_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(), eSymbolTypeData, Symtab::eDebugNo, Symtab::eVisibilityAny);
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#else
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // The mach-o object file parser already matches up the N_GSYM with with the non-stab
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // entry, so we shouldn't have to do that. If this ever changes, enable the code above
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // in the "#if 0" block. STSYM's always match the symbol as found below.
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                Symbol *exe_gsym_symbol = exe_symbol;
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // Next we find the non-stab entry that corresponds to the N_GSYM in the .o file
3447c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton                                Symbol *oso_gsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(), eSymbolTypeData, Symtab::eDebugNo, Symtab::eVisibilityAny);
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (exe_gsym_symbol && oso_gsym_symbol)
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    // If we found the symbol, then we
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    Section* exe_gsym_section = const_cast<Section *>(exe_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection());
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    Section* oso_gsym_section = const_cast<Section *>(oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection());
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    if (oso_gsym_section)
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    {
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SectionSP oso_gsym_section_sp (new Section (const_cast<Section *>(oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()),
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   oso_module,                         // Module (the .o file)
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   sect_id++,                          // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   exe_symbol->GetMangled().GetName(), // Name the section the same as the symbol for which is was generated!
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   eSectionTypeDebug,
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetOffset(),  // File VM address offset in the current section
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   1,                                   // We don't know the size of the global, just do the main address for now.
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   0, 0, 0));
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        oso_gsym_section_sp->SetLinkedLocation (exe_gsym_section,
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                               exe_gsym_symbol->GetValue().GetFileAddress() - exe_gsym_section->GetFileAddress());
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        oso_gsym_section->GetChildren().AddSection(oso_gsym_section_sp);
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        comp_unit_info->debug_map_sections_sp->AddSection(oso_gsym_section_sp);
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    }
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        case eSymbolTypeStatic:
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                            {
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // For each N_STSYM we remap the address for the global by making
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // a new section that we add to the sections found in the .o file.
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // This new section has the file address set to what the
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // addresses are in the .o file, and the load address is adjusted
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // to match where it ended up in the final executable! We do this
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // before we parse any dwarf info so that when it goes get parsed
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // all section/offset addresses that get registered will resolve
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // correctly to the new addresses in the main executable. We
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // initially set the section size to be 1 byte, but will need to
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // fix up these addresses further after all globals have been
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // parsed to span the gaps, or we can find the global variable
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // sizes from the DWARF info as we are parsing.
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                Symbol *exe_stsym_symbol = exe_symbol;
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // First we find the non-stab entry that corresponds to the N_STSYM in the .o file
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                Symbol *oso_stsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(), eSymbolTypeData);
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                if (exe_stsym_symbol && oso_stsym_symbol)
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                {
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                    // If we found the symbol, then we
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                    Section* exe_stsym_section = const_cast<Section *>(exe_stsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection());
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                    Section* oso_stsym_section = const_cast<Section *>(oso_stsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection());
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                    if (oso_stsym_section)
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                    {
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        // The load address of the symbol will use the section in the
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        // executable that contains the debug map that corresponds to
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        // the N_FUN symbol. We set the offset to reflect the offset
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        // into that section since we are creating a new section.
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        AddressRange stsym_load_range(exe_stsym_section, exe_stsym_symbol->GetValue().GetFileAddress() - exe_stsym_section->GetFileAddress(), 1);
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        // We need the symbol's section offset address from the .o file, but
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        // we need a non-zero size.
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        AddressRange stsym_file_range(exe_stsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection(), exe_stsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetOffset(), 1);
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        // Now we create a section that we will add as a child of the
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        // section in which the .o symbol (the N_FUN) exists.
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// TODO: mimic what I did for N_FUN if that works...
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                        // We use the 1 byte for the size because we don't know the
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                        // size of the global symbol without seeing the DWARF.
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                        SectionSP oso_fun_section_sp (new Section ( NULL, oso_module,                     // Module (the .o file)
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                                                                        sect_id++,                      // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                                                                        exe_symbol->GetMangled().GetName(),// Name the section the same as the symbol for which is was generated!
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                                                                       // &stsym_load_range,              // Load offset is the offset into the executable section for the N_FUN from the debug map
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                                                                        &stsym_file_range,              // File section/offset is just the same os the symbol on the .o file
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                                                                        0, 0, 0));
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                        // Now we add the new section to the .o file's sections as a child
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                        // of the section in which the N_SECT symbol exists.
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                        oso_stsym_section->GetChildren().AddSection(oso_fun_section_sp);
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                        comp_unit_info->debug_map_sections_sp->AddSection(oso_fun_section_sp);
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                    }
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                }
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                            }
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                            break;
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined(DEBUG_OSO_DMAP)
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s << "OSO sections after:\n";
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                oso_objfile->GetSectionList()->Dump(&s, NULL, true);
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (comp_unit_info->oso_symbol_vendor)
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return (SymbolFileDWARF *)comp_unit_info->oso_symbol_vendor->GetSymbolFile();
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetAbilities ()
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // In order to get the abilities of this plug-in, we look at the list of
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // N_OSO entries (object files) from the symbol table and make sure that
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // these files exist and also contain valid DWARF. If we get any of that
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // then we return the abilities of the first N_OSO's DWARF.
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t oso_index_count = GetNumCompileUnits();
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_index_count > 0)
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const uint32_t dwarf_abilities = SymbolFile::CompileUnits |
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::Functions |
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::Blocks |
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::GlobalVariables |
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::LocalVariables |
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::VariableTypes |
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::LineTables;
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (uint32_t oso_idx=0; oso_idx<oso_index_count; ++oso_idx)
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (oso_dwarf)
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t oso_abilities = oso_dwarf->GetAbilities();
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if ((oso_abilities & dwarf_abilities) == dwarf_abilities)
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return oso_abilities;
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetNumCompileUnits()
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    InitOSO ();
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_compile_unit_infos.size();
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitAtIndex(uint32_t cu_idx)
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompUnitSP comp_unit_sp;
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t cu_count = GetNumCompileUnits();
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cu_idx < cu_count)
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL)
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (cu_idx);
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (oso_dwarf)
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // There is only one compile unit for N_OSO entry right now, so
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // it will always exist at index zero.
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_compile_unit_infos[cu_idx].oso_compile_unit_sp = m_compile_unit_infos[cu_idx].oso_symbol_vendor->GetCompileUnitAtIndex (0);
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL)
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We weren't able to get the DWARF for this N_OSO entry (the
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // .o file may be missing or not at the specified path), make
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // one up as best we can from the debug map. We set the uid
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // of the compile unit to the symbol index with the MSBit set
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // so that it doesn't collide with any uid values from the DWARF
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Symbol *so_symbol = m_compile_unit_infos[cu_idx].so_symbol;
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (so_symbol)
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_compile_unit_infos[cu_idx].oso_compile_unit_sp.reset(new CompileUnit (m_obj_file->GetModule(),
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                            NULL,
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                            so_symbol->GetMangled().GetName().AsCString(),
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                            cu_idx,
5149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                                                            eLanguageTypeUnknown));
515ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton
516ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                    // Let our symbol vendor know about this compile unit
517ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                    m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex (m_compile_unit_infos[cu_idx].oso_compile_unit_sp,
518ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                                                                                       cu_idx);
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        comp_unit_sp = m_compile_unit_infos[cu_idx].oso_compile_unit_sp;
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return comp_unit_sp;
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CompileUnitInfo *
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetCompUnitInfo (const SymbolContext& sc)
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t cu_count = GetNumCompileUnits();
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (uint32_t i=0; i<cu_count; ++i)
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (sc.comp_unit == m_compile_unit_infos[i].oso_compile_unit_sp.get())
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return &m_compile_unit_infos[i];
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitFunctions (const SymbolContext& sc)
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseCompileUnitFunctions (sc);
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitLineTable (const SymbolContext& sc)
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseCompileUnitLineTable (sc);
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList &support_files)
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseCompileUnitSupportFiles (sc, support_files);
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseFunctionBlocks (const SymbolContext& sc)
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseFunctionBlocks (sc);
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseTypes (const SymbolContext& sc)
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseTypes (sc);
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseVariablesForContext (const SymbolContext& sc)
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseTypes (sc);
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerType*
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveTypeUID(lldb::user_id_t type_uid)
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
605462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonlldb::clang_type_t
606462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonSymbolFileDWARFDebugMap::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_Type)
607462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{
608462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    // We have a struct/union/class/enum that needs to be fully resolved.
609462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return NULL;
610462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton}
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveSymbolContext (const Address& exe_so_addr, uint32_t resolve_scope, SymbolContext& sc)
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t resolved_flags = 0;
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Symtab* symtab = m_obj_file->GetSymtab();
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symtab)
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const addr_t exe_file_addr = exe_so_addr.GetFileAddress();
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sc.symbol = symtab->FindSymbolContainingFileAddress (exe_file_addr, &m_func_indexes[0], m_func_indexes.size());
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (sc.symbol != NULL)
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolved_flags |= eSymbolContextSymbol;
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t oso_idx = 0;
6277c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithID (sc.symbol->GetID(), &oso_idx);
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (comp_unit_info)
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ObjectFile *oso_objfile = GetObjectFileByOSOIndex (oso_idx);
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (oso_dwarf && oso_objfile)
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    SectionList *oso_section_list = oso_objfile->GetSectionList();
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
636178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                    SectionSP oso_symbol_section_sp (oso_section_list->FindSectionContainingLinkedFileAddress (exe_file_addr, UINT32_MAX));
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
638178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                    if (oso_symbol_section_sp)
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
640178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                        const addr_t linked_file_addr = oso_symbol_section_sp->GetLinkedFileAddress();
641178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                        Address oso_so_addr (oso_symbol_section_sp.get(), exe_file_addr - linked_file_addr);
642178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                        if (oso_so_addr.IsSectionOffset())
643178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                            resolved_flags |= oso_dwarf->ResolveSymbolContext (oso_so_addr, resolve_scope, sc);
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return resolved_flags;
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveSymbolContext (const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t initial = sc_list.GetSize();
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t cu_count = GetNumCompileUnits();
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FileSpec so_file_spec;
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (uint32_t i=0; i<cu_count; ++i)
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (GetFileSpecForSO (i, so_file_spec))
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // By passing false to the comparison we will be able to match
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // and files given a filename only. If both file_spec and
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // so_file_spec have directories, we will still do a full match.
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (FileSpec::Compare (file_spec, so_file_spec, false) == 0)
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (i);
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                oso_dwarf->ResolveSymbolContext(file_spec, line, check_inlines, resolve_scope, sc_list);
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial;
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::PrivateFindGlobalVariables
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString &name,
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const std::vector<uint32_t> &indexes,   // Indexes into the symbol table that match "name"
68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t max_matches,
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    VariableList& variables
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t original_size = variables.GetSize();
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t match_count = indexes.size();
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (size_t i=0; i<match_count; ++i)
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t oso_idx;
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithIndex (indexes[i], &oso_idx);
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (comp_unit_info)
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (oso_dwarf)
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (oso_dwarf->FindGlobalVariables(name, true, max_matches, variables))
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (variables.GetSize() > max_matches)
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        break;
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return variables.GetSize() - original_size;
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::FindGlobalVariables (const ConstString &name, bool append, uint32_t max_matches, VariableList& variables)
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If we aren't appending the results to this list, then clear the list
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!append)
71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        variables.Clear();
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Remember how many variables are in the list before we search in case
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we are appending the results to a variable list.
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t original_size = variables.GetSize();
71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Symtab* symtab = m_obj_file->GetSymtab();
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symtab)
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::vector<uint32_t> indexes;
7237c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton        const size_t match_count = m_obj_file->GetSymtab()->FindAllSymbolsWithNameAndType (name, eSymbolTypeData, Symtab::eDebugYes, Symtab::eVisibilityAny, indexes);
72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (match_count)
72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            PrivateFindGlobalVariables (name, indexes, max_matches, variables);
72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Return the number of variable that were appended to the list
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return variables.GetSize() - original_size;
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::FindGlobalVariables (const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
7427c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::SymbolContainsSymbolWithIndex (uint32_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info)
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t symbol_idx = *symbol_idx_ptr;
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7467c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    if (symbol_idx < comp_unit_info->first_symbol_index)
7477c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton        return -1;
7487c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
7497c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    if (symbol_idx <= comp_unit_info->last_symbol_index)
7507c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton        return 0;
7517c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
7527c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    return 1;
7537c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton}
7547c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
7557c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
7567c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Claytonint
7577c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::SymbolContainsSymbolWithID (user_id_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info)
7587c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton{
7597c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    const user_id_t symbol_id = *symbol_idx_ptr;
7607c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
7617c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    if (symbol_id < comp_unit_info->so_symbol->GetID())
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return -1;
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7647c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    if (symbol_id <= comp_unit_info->last_symbol->GetID())
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 1;
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CompileUnitInfo*
77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithIndex (uint32_t symbol_idx, uint32_t *oso_idx_ptr)
77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t oso_index_count = m_compile_unit_infos.size();
77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompileUnitInfo *comp_unit_info = NULL;
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_index_count)
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7787c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton        comp_unit_info = (CompileUnitInfo*)bsearch(&symbol_idx, &m_compile_unit_infos[0], m_compile_unit_infos.size(), sizeof(CompileUnitInfo), (comparison_function)SymbolContainsSymbolWithIndex);
77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_idx_ptr)
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (comp_unit_info != NULL)
78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0];
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *oso_idx_ptr = UINT32_MAX;
78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return comp_unit_info;
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7917c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::CompileUnitInfo*
7927c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithID (user_id_t symbol_id, uint32_t *oso_idx_ptr)
7937c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton{
7947c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    const uint32_t oso_index_count = m_compile_unit_infos.size();
7957c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    CompileUnitInfo *comp_unit_info = NULL;
7967c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    if (oso_index_count)
7977c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    {
7987c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton        comp_unit_info = (CompileUnitInfo*)bsearch(&symbol_id, &m_compile_unit_infos[0], m_compile_unit_infos.size(), sizeof(CompileUnitInfo), (comparison_function)SymbolContainsSymbolWithID);
7997c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    }
8007c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
8017c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    if (oso_idx_ptr)
8027c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    {
8037c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton        if (comp_unit_info != NULL)
8047c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0];
8057c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton        else
8067c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            *oso_idx_ptr = UINT32_MAX;
8077c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    }
8087c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    return comp_unit_info;
8097c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton}
8107c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
8117c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
81288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Claytonstatic void
81388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg ClaytonRemoveFunctionsWithModuleNotEqualTo (Module *module, SymbolContextList &sc_list, uint32_t start_idx)
81488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton{
81588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // We found functions in .o files. Not all functions in the .o files
81688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // will have made it into the final output file. The ones that did
81788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // make it into the final output file will have a section whose module
81888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // matches the module from the ObjectFile for this SymbolFile. When
81988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // the modules don't match, then we have something that was in a
82088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // .o file, but doesn't map to anything in the final executable.
82188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    uint32_t i=start_idx;
82288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    while (i < sc_list.GetSize())
82388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    {
82488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        SymbolContext sc;
82588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        sc_list.GetContextAtIndex(i, sc);
82688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        if (sc.function)
82788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        {
82888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton            const Section *section = sc.function->GetAddressRange().GetBaseAddress().GetSection();
82988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton            if (section->GetModule() != module)
83088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton            {
83188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton                sc_list.RemoveContextAtIndex(i);
83288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton                continue;
83388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton            }
83488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        }
83588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        ++i;
83688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    }
83788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton}
83888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton
83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
84012bec71b323dc520f0e985a86e09c4712559e115Greg ClaytonSymbolFileDWARFDebugMap::FindFunctions(const ConstString &name, uint32_t name_type_mask, bool append, SymbolContextList& sc_list)
84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__,
84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        "SymbolFileDWARFDebugMap::FindFunctions (name = %s)",
84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        name.GetCString());
84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t initial_size = 0;
84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (append)
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        initial_size = sc_list.GetSize();
84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sc_list.Clear();
85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8527241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    uint32_t oso_idx = 0;
8537241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    SymbolFileDWARF *oso_dwarf;
8547241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL)
85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
85688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        uint32_t sc_idx = sc_list.GetSize();
85788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        if (oso_dwarf->FindFunctions(name, name_type_mask, true, sc_list))
85888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        {
85988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton            RemoveFunctionsWithModuleNotEqualTo (m_obj_file->GetModule(), sc_list, sc_idx);
86088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        }
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::FindFunctions (const RegularExpression& regex, bool append, SymbolContextList& sc_list)
86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__,
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        "SymbolFileDWARFDebugMap::FindFunctions (regex = '%s')",
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        regex.GetText());
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8747241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    uint32_t initial_size = 0;
8757241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    if (append)
8767241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton        initial_size = sc_list.GetSize();
8777241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    else
8787241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton        sc_list.Clear();
8797241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton
8807241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    uint32_t oso_idx = 0;
8817241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    SymbolFileDWARF *oso_dwarf;
8827241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL)
8837241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    {
88488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        uint32_t sc_idx = sc_list.GetSize();
88588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton
88688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        if (oso_dwarf->FindFunctions(regex, true, sc_list))
88788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        {
88888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton            RemoveFunctionsWithModuleNotEqualTo (m_obj_file->GetModule(), sc_list, sc_idx);
88988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        }
8907241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    }
8917241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton
8927241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    return sc_list.GetSize() - initial_size;
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
89595e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg ClaytonTypeSP
89695e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg ClaytonSymbolFileDWARFDebugMap::FindDefinitionTypeForDIE (
89795e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    DWARFCompileUnit* cu,
89895e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    const DWARFDebugInfoEntry *die,
89995e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    const ConstString &type_name
90095e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton)
90195e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton{
90295e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    TypeSP type_sp;
90395e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    SymbolFileDWARF *oso_dwarf;
90495e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
90595e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    {
90695e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton        type_sp = oso_dwarf->FindDefinitionTypeForDIE (cu, die, type_name);
90795e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton        if (type_sp)
90895e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton            break;
90995e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    }
91095e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    return type_sp;
91195e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton}
912960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
913960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Claytonuint32_t
9141924e2408687e0ee41976010c6b9410bdd01270dGreg ClaytonSymbolFileDWARFDebugMap::FindTypes
9151924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton(
9161924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    const SymbolContext& sc,
9171924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    const ConstString &name,
9181924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    bool append,
9191924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    uint32_t max_matches,
9201924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    TypeList& types
9211924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton)
922960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
923960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton    if (!append)
924960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        types.Clear();
9251924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton
9261924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    const uint32_t initial_types_size = types.GetSize();
9271924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    SymbolFileDWARF *oso_dwarf;
9281924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton
9291924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    if (sc.comp_unit)
9301924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    {
9311924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton        oso_dwarf = GetSymbolFile (sc);
9321924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton        if (oso_dwarf)
9331924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton            return oso_dwarf->FindTypes (sc, name, append, max_matches, types);
9341924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    }
9351924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    else
9361924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    {
9371924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton        uint32_t oso_idx = 0;
9381924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton        while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL)
9391924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton            oso_dwarf->FindTypes (sc, name, append, max_matches, types);
9401924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    }
9411924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton
9421924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    return types.GetSize() - initial_types_size;
943960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
944960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t
94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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)
94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (oso_dwarf)
95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return oso_dwarf->FindTypes (sc, regex, append, max_matches, encoding, udt_uid, types);
95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return 0;
95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// PluginInterface protocol
95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginName()
96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return "SymbolFileDWARFDebugMap";
96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetShortPluginName()
96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetPluginNameStatic();
96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginVersion()
97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 1;
97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginCommandHelp (const char *command, Stream *strm)
97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ExecutePluginCommand (Args &command, Stream *strm)
98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    error.SetErrorString("No plug-in command are currently supported.");
98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog *
99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::EnablePluginLogging (Stream *strm, Args &command)
99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
996ad60bf486dee699dd524225b63271ddc5b6329b9Greg Claytonvoid
997ad60bf486dee699dd524225b63271ddc5b6329b9Greg ClaytonSymbolFileDWARFDebugMap::SetCompileUnit (SymbolFileDWARF *oso_dwarf, const CompUnitSP &cu_sp)
998ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton{
999ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    const uint32_t cu_count = GetNumCompileUnits();
1000ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    for (uint32_t i=0; i<cu_count; ++i)
1001ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    {
1002ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        if (m_compile_unit_infos[i].oso_symbol_vendor &&
1003ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            m_compile_unit_infos[i].oso_symbol_vendor->GetSymbolFile() == oso_dwarf)
1004ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        {
1005ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            if (m_compile_unit_infos[i].oso_compile_unit_sp)
1006ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            {
1007ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                assert (m_compile_unit_infos[i].oso_compile_unit_sp.get() == cu_sp.get());
1008ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            }
1009ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            else
1010ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            {
1011ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                m_compile_unit_infos[i].oso_compile_unit_sp = cu_sp;
1012ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            }
1013ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        }
1014ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    }
1015ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton}
1016ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton
1017