SymbolFileDWARFDebugMap.cpp revision 12bec71b323dc520f0e985a86e09c4712559e115
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
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::InitOSO ()
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_flags.test(kHaveInitializedOSOs))
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_flags.set(kHaveInitializedOSOs);
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // In order to get the abilities of this plug-in, we look at the list of
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // N_OSO entries (object files) from the symbol table and make sure that
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // these files exist and also contain valid DWARF. If we get any of that
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // then we return the abilities of the first N_OSO's DWARF.
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Symtab* symtab = m_obj_file->GetSymtab();
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symtab)
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        //StreamFile s(0, 4, eByteOrderHost, stdout);
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::vector<uint32_t> oso_indexes;
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const uint32_t oso_index_count = symtab->AppendSymbolIndexesWithType(eSymbolTypeObjectFile, oso_indexes);
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symtab->AppendSymbolIndexesWithType(eSymbolTypeFunction, m_func_indexes);
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symtab->AppendSymbolIndexesWithType(eSymbolTypeGlobal, m_glob_indexes);
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symtab->SortSymbolIndexesByValue(m_func_indexes, true);
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symtab->SortSymbolIndexesByValue(m_glob_indexes, true);
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (oso_index_count > 0)
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_compile_unit_infos.resize(oso_index_count);
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          s.Printf("%s N_OSO symbols:\n", __PRETTY_FUNCTION__);
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          symtab->Dump(&s, oso_indexes);
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (uint32_t i=0; i<oso_index_count; ++i)
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_compile_unit_infos[i].so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 1);
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (m_compile_unit_infos[i].so_symbol->GetSiblingIndex() == 0)
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_compile_unit_infos[i].so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 2);
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_compile_unit_infos[i].oso_symbol = symtab->SymbolAtIndex(oso_indexes[i]);
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule *
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetModuleByOSOIndex (uint32_t oso_idx)
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t cu_count = GetNumCompileUnits();
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_idx < cu_count)
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetModuleByCompUnitInfo (&m_compile_unit_infos[oso_idx]);
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule *
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetModuleByCompUnitInfo (CompileUnitInfo *comp_unit_info)
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (comp_unit_info->oso_module_sp.get() == NULL)
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symbol *oso_symbol = comp_unit_info->oso_symbol;
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (oso_symbol)
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            FileSpec oso_file_spec(oso_symbol->GetMangled().GetName().AsCString());
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ModuleList::GetSharedModule (oso_file_spec,
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         m_obj_file->GetModule()->GetArchitecture(),
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         NULL,  // UUID pointer
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         NULL,  // object name
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         0,     // object offset
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         comp_unit_info->oso_module_sp,
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         NULL,
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         NULL);
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            //comp_unit_info->oso_module_sp.reset(new Module (oso_file_spec, m_obj_file->GetModule()->GetArchitecture()));
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return comp_unit_info->oso_module_sp.get();
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetFileSpecForSO (uint32_t oso_idx, FileSpec &file_spec)
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_idx < m_compile_unit_infos.size())
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!m_compile_unit_infos[oso_idx].so_file)
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_compile_unit_infos[oso_idx].so_symbol == NULL)
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::string so_path (m_compile_unit_infos[oso_idx].so_symbol->GetMangled().GetName().AsCString());
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_compile_unit_infos[oso_idx].so_symbol[1].GetType() == eSymbolTypeSourceFile)
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                so_path += m_compile_unit_infos[oso_idx].so_symbol[1].GetMangled().GetName().AsCString();
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_compile_unit_infos[oso_idx].so_file.SetFile(so_path.c_str());
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        file_spec = m_compile_unit_infos[oso_idx].so_file;
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile *
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetObjectFileByOSOIndex (uint32_t oso_idx)
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Module *oso_module = GetModuleByOSOIndex (oso_idx);
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_module)
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_module->GetObjectFile();
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF *
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFile (const SymbolContext& sc)
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompileUnitInfo *comp_unit_info = GetCompUnitInfo (sc);
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (comp_unit_info)
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetSymbolFileByCompUnitInfo (comp_unit_info);
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile *
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetObjectFileByCompUnitInfo (CompileUnitInfo *comp_unit_info)
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Module *oso_module = GetModuleByCompUnitInfo (comp_unit_info);
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_module)
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_module->GetObjectFile();
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF *
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFileByOSOIndex (uint32_t oso_idx)
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_idx < m_compile_unit_infos.size())
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[oso_idx]);
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF *
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFileByCompUnitInfo (CompileUnitInfo *comp_unit_info)
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (comp_unit_info->oso_symbol_vendor == NULL)
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *oso_objfile = GetObjectFileByCompUnitInfo (comp_unit_info);
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (oso_objfile)
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            comp_unit_info->oso_symbol_vendor = oso_objfile->GetModule()->GetSymbolVendor();
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          SymbolFileDWARF *oso_dwarf = new SymbolFileDWARF(oso_objfile);
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          comp_unit_info->oso_dwarf_sp.reset (oso_dwarf);
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (comp_unit_info->oso_symbol_vendor)
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Set a bit that lets this DWARF file know that it is being
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // used along with a debug map and that it will have the
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // remapped sections that we do below.
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ((SymbolFileDWARF *)comp_unit_info->oso_symbol_vendor->GetSymbolFile())->GetFlags().Set(SymbolFileDWARF::flagsDWARFIsOSOForDebugMap);
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                comp_unit_info->debug_map_sections_sp.reset(new SectionList);
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Symtab *exe_symtab = m_obj_file->GetSymtab();
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Module *oso_module = oso_objfile->GetModule();
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Symtab *oso_symtab = oso_objfile->GetSymtab();
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//#define DEBUG_OSO_DMAP    // Do not check in with this defined...
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined(DEBUG_OSO_DMAP)
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StreamFile s(stdout);
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s << "OSO symtab:\n";
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                oso_symtab->Dump(&s, NULL);
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s << "OSO sections before:\n";
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                oso_objfile->GetSectionList()->Dump(&s, NULL, true);
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ///const uint32_t fun_resolve_flags = SymbolContext::Module | eSymbolContextCompUnit | eSymbolContextFunction;
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                //SectionList *oso_sections = oso_objfile->Sections();
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Now we need to make sections that map from zero based object
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // file addresses to where things eneded up in the main executable.
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t oso_start_idx = comp_unit_info->oso_symbol->GetID() + 1;
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const uint32_t oso_end_idx = comp_unit_info->so_symbol->GetSiblingIndex();
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t sect_id = 0x10000;
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (uint32_t idx = oso_start_idx; idx < oso_end_idx; ++idx)
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    Symbol *exe_symbol = exe_symtab->SymbolAtIndex(idx);
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (exe_symbol)
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        switch (exe_symbol->GetType())
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case eSymbolTypeFunction:
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // For each N_FUN, or function that we run into in the debug map
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // we make a new section that we add to the sections found in the
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // .o file. This new section has the file address set to what the
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // addresses are in the .o file, and the load address is adjusted
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // to match where it ended up in the final executable! We do this
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // before we parse any dwarf info so that when it goes get parsed
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // all section/offset addresses that get registered will resolve
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // correctly to the new addresses in the main executable.
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // First we find the original symbol in the .o file's symbol table
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                Symbol *oso_fun_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(), eSymbolTypeCode);
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (oso_fun_symbol)
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    // If we found the symbol, then we
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    Section* exe_fun_section = const_cast<Section *>(exe_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection());
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    Section* oso_fun_section = const_cast<Section *>(oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection());
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    if (oso_fun_section)
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    {
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // Now we create a section that we will add as a child of the
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // section in which the .o symbol (the N_FUN) exists.
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // We use the exe_symbol size because the one in the .o file
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // will just be a symbol with no size, and the exe_symbol
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // size will reflect any size changes (ppc has been known to
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // shrink function sizes when it gets rid of jump islands that
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // aren't needed anymore).
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SectionSP oso_fun_section_sp (new Section (const_cast<Section *>(oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()),
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   oso_module,                         // Module (the .o file)
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   sect_id++,                          // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   exe_symbol->GetMangled().GetName(), // Name the section the same as the symbol for which is was generated!
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   eSectionTypeDebug,
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetOffset(),  // File VM address offset in the current section
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   exe_symbol->GetByteSize(),          // File size (we need the size from the executable)
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   0, 0, 0));
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        oso_fun_section_sp->SetLinkedLocation (exe_fun_section,
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                               exe_symbol->GetValue().GetFileAddress() - exe_fun_section->GetFileAddress());
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        oso_fun_section->GetChildren().AddSection(oso_fun_section_sp);
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        comp_unit_info->debug_map_sections_sp->AddSection(oso_fun_section_sp);
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    }
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case eSymbolTypeGlobal:
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case eSymbolTypeStatic:
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // For each N_GSYM we remap the address for the global by making
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // a new section that we add to the sections found in the .o file.
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // This new section has the file address set to what the
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // addresses are in the .o file, and the load address is adjusted
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // to match where it ended up in the final executable! We do this
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // before we parse any dwarf info so that when it goes get parsed
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // all section/offset addresses that get registered will resolve
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // correctly to the new addresses in the main executable. We
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // initially set the section size to be 1 byte, but will need to
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // fix up these addresses further after all globals have been
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // parsed to span the gaps, or we can find the global variable
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // sizes from the DWARF info as we are parsing.
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if 0
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // First we find the non-stab entry that corresponds to the N_GSYM in the executable
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                Symbol *exe_gsym_symbol = exe_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(), eSymbolTypeData);
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#else
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // The mach-o object file parser already matches up the N_GSYM with with the non-stab
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // entry, so we shouldn't have to do that. If this ever changes, enable the code above
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // in the "#if 0" block. STSYM's always match the symbol as found below.
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                Symbol *exe_gsym_symbol = exe_symbol;
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                // Next we find the non-stab entry that corresponds to the N_GSYM in the .o file
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                Symbol *oso_gsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(), eSymbolTypeData);
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (exe_gsym_symbol && oso_gsym_symbol)
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    // If we found the symbol, then we
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    Section* exe_gsym_section = const_cast<Section *>(exe_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection());
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    Section* oso_gsym_section = const_cast<Section *>(oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection());
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    if (oso_gsym_section)
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    {
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SectionSP oso_gsym_section_sp (new Section (const_cast<Section *>(oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()),
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   oso_module,                         // Module (the .o file)
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   sect_id++,                          // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   exe_symbol->GetMangled().GetName(), // Name the section the same as the symbol for which is was generated!
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   eSectionTypeDebug,
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetOffset(),  // File VM address offset in the current section
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   1,                                   // We don't know the size of the global, just do the main address for now.
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                   0, 0, 0));
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        oso_gsym_section_sp->SetLinkedLocation (exe_gsym_section,
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                               exe_gsym_symbol->GetValue().GetFileAddress() - exe_gsym_section->GetFileAddress());
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        oso_gsym_section->GetChildren().AddSection(oso_gsym_section_sp);
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        comp_unit_info->debug_map_sections_sp->AddSection(oso_gsym_section_sp);
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    }
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        case eSymbolTypeStatic:
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                            {
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // For each N_STSYM we remap the address for the global by making
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // a new section that we add to the sections found in the .o file.
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // This new section has the file address set to what the
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // addresses are in the .o file, and the load address is adjusted
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // to match where it ended up in the final executable! We do this
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // before we parse any dwarf info so that when it goes get parsed
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // all section/offset addresses that get registered will resolve
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // correctly to the new addresses in the main executable. We
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // initially set the section size to be 1 byte, but will need to
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // fix up these addresses further after all globals have been
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // parsed to span the gaps, or we can find the global variable
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // sizes from the DWARF info as we are parsing.
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                Symbol *exe_stsym_symbol = exe_symbol;
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                // First we find the non-stab entry that corresponds to the N_STSYM in the .o file
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                Symbol *oso_stsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(), eSymbolTypeData);
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                if (exe_stsym_symbol && oso_stsym_symbol)
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                {
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                    // If we found the symbol, then we
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                    Section* exe_stsym_section = const_cast<Section *>(exe_stsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection());
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                    Section* oso_stsym_section = const_cast<Section *>(oso_stsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection());
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                    if (oso_stsym_section)
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                    {
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        // The load address of the symbol will use the section in the
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        // executable that contains the debug map that corresponds to
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        // the N_FUN symbol. We set the offset to reflect the offset
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        // into that section since we are creating a new section.
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        AddressRange stsym_load_range(exe_stsym_section, exe_stsym_symbol->GetValue().GetFileAddress() - exe_stsym_section->GetFileAddress(), 1);
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        // We need the symbol's section offset address from the .o file, but
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        // we need a non-zero size.
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        AddressRange stsym_file_range(exe_stsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection(), exe_stsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetOffset(), 1);
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        // Now we create a section that we will add as a child of the
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                        // section in which the .o symbol (the N_FUN) exists.
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// TODO: mimic what I did for N_FUN if that works...
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                        // We use the 1 byte for the size because we don't know the
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                        // size of the global symbol without seeing the DWARF.
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                        SectionSP oso_fun_section_sp (new Section ( NULL, oso_module,                     // Module (the .o file)
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                                                                        sect_id++,                      // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                                                                        exe_symbol->GetMangled().GetName(),// Name the section the same as the symbol for which is was generated!
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                                                                       // &stsym_load_range,              // Load offset is the offset into the executable section for the N_FUN from the debug map
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                                                                        &stsym_file_range,              // File section/offset is just the same os the symbol on the .o file
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                                                                        0, 0, 0));
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                        // Now we add the new section to the .o file's sections as a child
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                        // of the section in which the N_SECT symbol exists.
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                        oso_stsym_section->GetChildren().AddSection(oso_fun_section_sp);
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                                        comp_unit_info->debug_map_sections_sp->AddSection(oso_fun_section_sp);
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                    }
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                }
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                            }
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                            break;
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined(DEBUG_OSO_DMAP)
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                s << "OSO sections after:\n";
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                oso_objfile->GetSectionList()->Dump(&s, NULL, true);
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (comp_unit_info->oso_symbol_vendor)
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return (SymbolFileDWARF *)comp_unit_info->oso_symbol_vendor->GetSymbolFile();
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetAbilities ()
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // In order to get the abilities of this plug-in, we look at the list of
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // N_OSO entries (object files) from the symbol table and make sure that
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // these files exist and also contain valid DWARF. If we get any of that
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // then we return the abilities of the first N_OSO's DWARF.
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t oso_index_count = GetNumCompileUnits();
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_index_count > 0)
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const uint32_t dwarf_abilities = SymbolFile::CompileUnits |
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::Functions |
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::Blocks |
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::GlobalVariables |
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::LocalVariables |
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::VariableTypes |
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         SymbolFile::LineTables;
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (uint32_t oso_idx=0; oso_idx<oso_index_count; ++oso_idx)
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (oso_dwarf)
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t oso_abilities = oso_dwarf->GetAbilities();
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if ((oso_abilities & dwarf_abilities) == dwarf_abilities)
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return oso_abilities;
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetNumCompileUnits()
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    InitOSO ();
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_compile_unit_infos.size();
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitAtIndex(uint32_t cu_idx)
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompUnitSP comp_unit_sp;
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t cu_count = GetNumCompileUnits();
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cu_idx < cu_count)
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL)
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (cu_idx);
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (oso_dwarf)
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // There is only one compile unit for N_OSO entry right now, so
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // it will always exist at index zero.
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_compile_unit_infos[cu_idx].oso_compile_unit_sp = m_compile_unit_infos[cu_idx].oso_symbol_vendor->GetCompileUnitAtIndex (0);
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL)
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We weren't able to get the DWARF for this N_OSO entry (the
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // .o file may be missing or not at the specified path), make
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // one up as best we can from the debug map. We set the uid
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // of the compile unit to the symbol index with the MSBit set
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // so that it doesn't collide with any uid values from the DWARF
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Symbol *so_symbol = m_compile_unit_infos[cu_idx].so_symbol;
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (so_symbol)
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_compile_unit_infos[cu_idx].oso_compile_unit_sp.reset(new CompileUnit (m_obj_file->GetModule(),
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                            NULL,
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                            so_symbol->GetMangled().GetName().AsCString(),
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                            cu_idx,
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                            Language::Unknown));
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        comp_unit_sp = m_compile_unit_infos[cu_idx].oso_compile_unit_sp;
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return comp_unit_sp;
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CompileUnitInfo *
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetCompUnitInfo (const SymbolContext& sc)
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t cu_count = GetNumCompileUnits();
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (uint32_t i=0; i<cu_count; ++i)
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (sc.comp_unit == m_compile_unit_infos[i].oso_compile_unit_sp.get())
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return &m_compile_unit_infos[i];
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitFunctions (const SymbolContext& sc)
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseCompileUnitFunctions (sc);
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitLineTable (const SymbolContext& sc)
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseCompileUnitLineTable (sc);
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList &support_files)
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseCompileUnitSupportFiles (sc, support_files);
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseFunctionBlocks (const SymbolContext& sc)
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseFunctionBlocks (sc);
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseTypes (const SymbolContext& sc)
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseTypes (sc);
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseVariablesForContext (const SymbolContext& sc)
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseTypes (sc);
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerType*
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveTypeUID(lldb::user_id_t type_uid)
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveSymbolContext (const Address& exe_so_addr, uint32_t resolve_scope, SymbolContext& sc)
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t resolved_flags = 0;
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Symtab* symtab = m_obj_file->GetSymtab();
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symtab)
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const addr_t exe_file_addr = exe_so_addr.GetFileAddress();
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sc.symbol = symtab->FindSymbolContainingFileAddress (exe_file_addr, &m_func_indexes[0], m_func_indexes.size());
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (sc.symbol != NULL)
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolved_flags |= eSymbolContextSymbol;
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t oso_idx = 0;
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithIndex (sc.symbol->GetID(), &oso_idx);
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (comp_unit_info)
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ObjectFile *oso_objfile = GetObjectFileByOSOIndex (oso_idx);
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (oso_dwarf && oso_objfile)
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    SectionList *oso_section_list = oso_objfile->GetSectionList();
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    SectionSP oso_section_sp(oso_section_list->FindSectionByName(exe_so_addr.GetSection()->GetName()));
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (oso_section_sp)
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        SectionSP oso_symbol_section_sp (oso_section_sp->GetChildren().FindSectionContainingLinkedFileAddress (exe_file_addr));
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (oso_symbol_section_sp)
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            const addr_t linked_file_addr = oso_symbol_section_sp->GetLinkedFileAddress();
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            Address oso_so_addr (oso_symbol_section_sp.get(), exe_file_addr - linked_file_addr);
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (oso_so_addr.IsSectionOffset())
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                resolved_flags |= oso_dwarf->ResolveSymbolContext (oso_so_addr, resolve_scope, sc);
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Map the load address from in the executable back to a
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // section/offset address in the .o file so we can do
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // lookups in the .o DWARF.
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    Address oso_so_addr (exe_load_addr, false, comp_unit_info->debug_map_sections_sp.get());
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // Make sure we were able to resolve this back to a .o
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // section offset address, and if so, resolve the context
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // for everything that was asked for.
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (oso_so_addr.IsSectionOffset())
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        resolved_flags |= oso_dwarf->ResolveSymbolContext (oso_so_addr, resolve_scope, sc);
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return resolved_flags;
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveSymbolContext (const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t initial = sc_list.GetSize();
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t cu_count = GetNumCompileUnits();
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FileSpec so_file_spec;
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (uint32_t i=0; i<cu_count; ++i)
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (GetFileSpecForSO (i, so_file_spec))
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // By passing false to the comparison we will be able to match
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // and files given a filename only. If both file_spec and
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // so_file_spec have directories, we will still do a full match.
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (FileSpec::Compare (file_spec, so_file_spec, false) == 0)
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (i);
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                oso_dwarf->ResolveSymbolContext(file_spec, line, check_inlines, resolve_scope, sc_list);
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial;
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::PrivateFindGlobalVariables
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString &name,
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const std::vector<uint32_t> &indexes,   // Indexes into the symbol table that match "name"
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t max_matches,
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    VariableList& variables
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t original_size = variables.GetSize();
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t match_count = indexes.size();
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (size_t i=0; i<match_count; ++i)
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t oso_idx;
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithIndex (indexes[i], &oso_idx);
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (comp_unit_info)
68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (oso_dwarf)
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (oso_dwarf->FindGlobalVariables(name, true, max_matches, variables))
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (variables.GetSize() > max_matches)
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        break;
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return variables.GetSize() - original_size;
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::FindGlobalVariables (const ConstString &name, bool append, uint32_t max_matches, VariableList& variables)
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If we aren't appending the results to this list, then clear the list
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!append)
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        variables.Clear();
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Remember how many variables are in the list before we search in case
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we are appending the results to a variable list.
70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t original_size = variables.GetSize();
70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Symtab* symtab = m_obj_file->GetSymtab();
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symtab)
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::vector<uint32_t> indexes;
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t match_count = m_obj_file->GetSymtab()->FindAllSymbolsWithNameAndType (name, eSymbolTypeGlobal, indexes);
71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (match_count)
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            PrivateFindGlobalVariables (name, indexes, max_matches, variables);
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Return the number of variable that were appended to the list
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return variables.GetSize() - original_size;
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::FindGlobalVariables (const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::SymbolContainsSymbolIndex (uint32_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info)
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t symbol_idx = *symbol_idx_ptr;
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbol_idx < comp_unit_info->so_symbol->GetID())
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return -1;
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbol_idx < comp_unit_info->so_symbol->GetSiblingIndex())
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 1;
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CompileUnitInfo*
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithIndex (uint32_t symbol_idx, uint32_t *oso_idx_ptr)
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t oso_index_count = m_compile_unit_infos.size();
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompileUnitInfo *comp_unit_info = NULL;
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_index_count)
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        comp_unit_info = (CompileUnitInfo*)bsearch(&symbol_idx, &m_compile_unit_infos[0], m_compile_unit_infos.size(), sizeof(CompileUnitInfo), (comparison_function)SymbolContainsSymbolIndex);
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_idx_ptr)
75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (comp_unit_info != NULL)
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0];
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *oso_idx_ptr = UINT32_MAX;
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return comp_unit_info;
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
76612bec71b323dc520f0e985a86e09c4712559e115Greg ClaytonSymbolFileDWARFDebugMap::FindFunctions(const ConstString &name, uint32_t name_type_mask, bool append, SymbolContextList& sc_list)
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__,
76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        "SymbolFileDWARFDebugMap::FindFunctions (name = %s)",
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        name.GetCString());
77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<uint32_t> indexes;
77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t initial_size = 0;
77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (append)
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        initial_size = sc_list.GetSize();
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sc_list.Clear();
77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t match_count = m_obj_file->GetSymtab()->FindAllSymbolsWithNameAndType (name, eSymbolTypeFunction, indexes);
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (match_count > 0)
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (size_t i=0; i<match_count; ++i)
78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t oso_idx;
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithIndex (indexes[i], &oso_idx);
78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (comp_unit_info)
78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (oso_dwarf)
79112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton                    oso_dwarf->FindFunctions(name, name_type_mask, true, sc_list);
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      Stream s(stdout);
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      sc_list.Dump(&s);
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::FindFunctions (const RegularExpression& regex, bool append, SymbolContextList& sc_list)
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__,
80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        "SymbolFileDWARFDebugMap::FindFunctions (regex = '%s')",
80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        regex.GetText());
80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//SymbolFileDWARFDebugMap::FindTypes (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, Type::Encoding encoding, lldb::user_id_t udt_uid, TypeList& types)
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (oso_dwarf)
81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return oso_dwarf->FindTypes (sc, name, append, max_matches, encoding, udt_uid, types);
82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return 0;
82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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)
82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (oso_dwarf)
82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return oso_dwarf->FindTypes (sc, regex, append, max_matches, encoding, udt_uid, types);
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return 0;
83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// PluginInterface protocol
83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginName()
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return "SymbolFileDWARFDebugMap";
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetShortPluginName()
84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetPluginNameStatic();
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginVersion()
85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 1;
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginCommandHelp (const char *command, Stream *strm)
85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ExecutePluginCommand (Args &command, Stream *strm)
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    error.SetErrorString("No plug-in command are currently supported.");
86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog *
86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::EnablePluginLogging (Stream *strm, Args &command)
86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
874