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
1200f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata#include "DWARFDebugAranges.h"
1300f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata
1400f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata#include "lldb/Core/RangeMap.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ModuleList.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h"
1949ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Section.h"
20464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
21464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton//#define DEBUG_OSO_DMAP // DO NOT CHECKIN WITH THIS NOT COMMENTED OUT
2249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#if defined(DEBUG_OSO_DMAP)
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamFile.h"
2449ce8969d3154e1560106cfe530444c09410f217Greg Clayton#endif
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
26b01000fd063629facd45044f137446fb748ee179Greg Clayton
27b01000fd063629facd45044f137446fb748ee179Greg Clayton#include "lldb/Symbol/ClangExternalASTSourceCallbacks.h"
2849ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/CompileUnit.h"
29464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton#include "lldb/Symbol/LineTable.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan#include "LogChannelDWARF.h"
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "SymbolFileDWARF.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4049ce8969d3154e1560106cfe530444c09410f217Greg Clayton// Subclass lldb_private::Module so we can intercept the "Module::GetObjectFile()"
4149ce8969d3154e1560106cfe530444c09410f217Greg Clayton// (so we can fixup the object file sections) and also for "Module::GetSymbolVendor()"
4249ce8969d3154e1560106cfe530444c09410f217Greg Clayton// (so we can fixup the symbol file id.
4349ce8969d3154e1560106cfe530444c09410f217Greg Clayton
44464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
45464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
46464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
47464a5063bc59755cb6ec063d0b2491097302d2abGreg Claytonconst SymbolFileDWARFDebugMap::FileRangeMap &
48464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonSymbolFileDWARFDebugMap::CompileUnitInfo::GetFileRangeMap(SymbolFileDWARFDebugMap *exe_symfile)
4949ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
50464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    if (file_range_map_valid)
51464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        return file_range_map;
5249ce8969d3154e1560106cfe530444c09410f217Greg Clayton
53464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    file_range_map_valid = true;
54464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
55464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    Module *oso_module = exe_symfile->GetModuleByCompUnitInfo (this);
56d93d69d12049dc1c99e0c828509730ea3d9b1aaaJim Ingham    if (!oso_module)
57d93d69d12049dc1c99e0c828509730ea3d9b1aaaJim Ingham        return file_range_map;
58d93d69d12049dc1c99e0c828509730ea3d9b1aaaJim Ingham
59464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    ObjectFile *oso_objfile = oso_module->GetObjectFile();
6053fde4be112df69d2b2f3d700b2556770f1223d5Greg Clayton    if (!oso_objfile)
6153fde4be112df69d2b2f3d700b2556770f1223d5Greg Clayton        return file_range_map;
62464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
63952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_MAP));
64464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    if (log)
6572a005e7ce67677d5180def2ae1c6bb65bd8129aGreg Clayton    {
66464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        ConstString object_name (oso_module->GetObjectName());
6797a19b21dacd9063bb5475812df7781777262198Greg Clayton        log->Printf("%p: SymbolFileDWARFDebugMap::CompileUnitInfo::GetFileRangeMap ('%s')",
68464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                    this,
6997a19b21dacd9063bb5475812df7781777262198Greg Clayton                    oso_module->GetSpecificationDescription().c_str());
7072a005e7ce67677d5180def2ae1c6bb65bd8129aGreg Clayton    }
71464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
7272a005e7ce67677d5180def2ae1c6bb65bd8129aGreg Clayton
73464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    std::vector<SymbolFileDWARFDebugMap::CompileUnitInfo *> cu_infos;
74464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    if (exe_symfile->GetCompUnitInfosForModule(oso_module, cu_infos))
7549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
76464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        for (auto comp_unit_info : cu_infos)
7749ce8969d3154e1560106cfe530444c09410f217Greg Clayton        {
787940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            Symtab *exe_symtab = exe_symfile->GetObjectFile()->GetSymtab();
79464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            ModuleSP oso_module_sp (oso_objfile->GetModule());
807940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            Symtab *oso_symtab = oso_objfile->GetSymtab();
81464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
82464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            ///const uint32_t fun_resolve_flags = SymbolContext::Module | eSymbolContextCompUnit | eSymbolContextFunction;
83464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            //SectionList *oso_sections = oso_objfile->Sections();
84464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            // Now we need to make sections that map from zero based object
85464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            // file addresses to where things eneded up in the main executable.
86464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
87464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            assert (comp_unit_info->first_symbol_index != UINT32_MAX);
88464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            // End index is one past the last valid symbol index
89464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            const uint32_t oso_end_idx = comp_unit_info->last_symbol_index + 1;
90464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            for (uint32_t idx = comp_unit_info->first_symbol_index + 2; // Skip the N_SO and N_OSO
91464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                 idx < oso_end_idx;
92464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                 ++idx)
9349ce8969d3154e1560106cfe530444c09410f217Greg Clayton            {
94464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                Symbol *exe_symbol = exe_symtab->SymbolAtIndex(idx);
95464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                if (exe_symbol)
9649ce8969d3154e1560106cfe530444c09410f217Greg Clayton                {
97464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                    if (exe_symbol->IsDebug() == false)
98464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                        continue;
99464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
100464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                    switch (exe_symbol->GetType())
10149ce8969d3154e1560106cfe530444c09410f217Greg Clayton                    {
102464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                    default:
103464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                        break;
104464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
105464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                    case eSymbolTypeCode:
10649ce8969d3154e1560106cfe530444c09410f217Greg Clayton                        {
107464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // For each N_FUN, or function that we run into in the debug map
108464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // we make a new section that we add to the sections found in the
109464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // .o file. This new section has the file address set to what the
110464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // addresses are in the .o file, and the load address is adjusted
111464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // to match where it ended up in the final executable! We do this
112464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // before we parse any dwarf info so that when it goes get parsed
113464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // all section/offset addresses that get registered will resolve
114464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // correctly to the new addresses in the main executable.
115464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
116464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // First we find the original symbol in the .o file's symbol table
117464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            Symbol *oso_fun_symbol = oso_symtab->FindFirstSymbolWithNameAndType (exe_symbol->GetMangled().GetName(Mangled::ePreferMangled),
118464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                                                                                 eSymbolTypeCode,
119464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                                                                                 Symtab::eDebugNo,
120464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                                                                                 Symtab::eVisibilityAny);
121464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            if (oso_fun_symbol)
1223cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                            {
123464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                // Add the inverse OSO file address to debug map entry mapping
124464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                exe_symfile->AddOSOFileRange (this,
125464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                                              exe_symbol->GetAddress().GetFileAddress(),
126464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                                              oso_fun_symbol->GetAddress().GetFileAddress(),
127464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                                              std::min<addr_t>(exe_symbol->GetByteSize(), oso_fun_symbol->GetByteSize()));
1283cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton
12949ce8969d3154e1560106cfe530444c09410f217Greg Clayton                            }
13049ce8969d3154e1560106cfe530444c09410f217Greg Clayton                        }
131464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                        break;
132464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
133464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                    case eSymbolTypeData:
134464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                        {
135464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // For each N_GSYM we remap the address for the global by making
136464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // a new section that we add to the sections found in the .o file.
137464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // This new section has the file address set to what the
138464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // addresses are in the .o file, and the load address is adjusted
139464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // to match where it ended up in the final executable! We do this
140464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // before we parse any dwarf info so that when it goes get parsed
141464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // all section/offset addresses that get registered will resolve
142464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // correctly to the new addresses in the main executable. We
143464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // initially set the section size to be 1 byte, but will need to
144464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // fix up these addresses further after all globals have been
145464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // parsed to span the gaps, or we can find the global variable
146464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // sizes from the DWARF info as we are parsing.
147464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
148464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            // Next we find the non-stab entry that corresponds to the N_GSYM in the .o file
149464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            Symbol *oso_gsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType (exe_symbol->GetMangled().GetName(Mangled::ePreferMangled),
150464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                                                                                  eSymbolTypeData,
151464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                                                                                  Symtab::eDebugNo,
152464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                                                                                  Symtab::eVisibilityAny);
153464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
154464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            if (exe_symbol && oso_gsym_symbol &&
155464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                exe_symbol->ValueIsAddress() &&
156464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                oso_gsym_symbol->ValueIsAddress())
157464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            {
158464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                // Add the inverse OSO file address to debug map entry mapping
159464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                exe_symfile->AddOSOFileRange (this,
160464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                                              exe_symbol->GetAddress().GetFileAddress(),
161464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                                              oso_gsym_symbol->GetAddress().GetFileAddress(),
162464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                                              std::min<addr_t>(exe_symbol->GetByteSize(), oso_gsym_symbol->GetByteSize()));
163464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            }
164464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                        }
165464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                        break;
16649ce8969d3154e1560106cfe530444c09410f217Greg Clayton                    }
16749ce8969d3154e1560106cfe530444c09410f217Greg Clayton                }
16849ce8969d3154e1560106cfe530444c09410f217Greg Clayton            }
169464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
170464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            exe_symfile->FinalizeOSOFileRanges (this);
171464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            // We don't need the symbols anymore for the .o files
1727940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            oso_objfile->ClearSymtab();
17349ce8969d3154e1560106cfe530444c09410f217Greg Clayton        }
17449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
175464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    return file_range_map;
176464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton}
177464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
178464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
179464a5063bc59755cb6ec063d0b2491097302d2abGreg Claytonclass DebugMapModule : public Module
180464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{
181464a5063bc59755cb6ec063d0b2491097302d2abGreg Claytonpublic:
182464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    DebugMapModule (const ModuleSP &exe_module_sp,
183464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                    uint32_t cu_idx,
184464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                    const FileSpec& file_spec,
185464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                    const ArchSpec& arch,
186464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                    const ConstString *object_name,
1870e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                    off_t object_offset,
1880e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                    const TimeValue *object_mod_time_ptr) :
1890e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        Module (file_spec, arch, object_name, object_offset, object_mod_time_ptr),
190464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        m_exe_module_wp (exe_module_sp),
191464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        m_cu_idx (cu_idx)
192464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    {
193464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    }
194464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
195464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    virtual
196464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    ~DebugMapModule ()
197464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    {
198464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    }
199464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
20049ce8969d3154e1560106cfe530444c09410f217Greg Clayton
20149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    virtual SymbolVendor*
202188091899842b140313b54e097f16efbe165c998Greg Clayton    GetSymbolVendor(bool can_create = true, lldb_private::Stream *feedback_strm = NULL)
20349ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
20449ce8969d3154e1560106cfe530444c09410f217Greg Clayton        // Scope for locker
20549ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (m_symfile_ap.get() || can_create == false)
20649ce8969d3154e1560106cfe530444c09410f217Greg Clayton            return m_symfile_ap.get();
20749ce8969d3154e1560106cfe530444c09410f217Greg Clayton
20849ce8969d3154e1560106cfe530444c09410f217Greg Clayton        ModuleSP exe_module_sp (m_exe_module_wp.lock());
20949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (exe_module_sp)
21049ce8969d3154e1560106cfe530444c09410f217Greg Clayton        {
21149ce8969d3154e1560106cfe530444c09410f217Greg Clayton            // Now get the object file outside of a locking scope
21249ce8969d3154e1560106cfe530444c09410f217Greg Clayton            ObjectFile *oso_objfile = GetObjectFile ();
21349ce8969d3154e1560106cfe530444c09410f217Greg Clayton            if (oso_objfile)
21449ce8969d3154e1560106cfe530444c09410f217Greg Clayton            {
21549ce8969d3154e1560106cfe530444c09410f217Greg Clayton                Mutex::Locker locker (m_mutex);
216188091899842b140313b54e097f16efbe165c998Greg Clayton                SymbolVendor* symbol_vendor = Module::GetSymbolVendor(can_create, feedback_strm);
21749ce8969d3154e1560106cfe530444c09410f217Greg Clayton                if (symbol_vendor)
21849ce8969d3154e1560106cfe530444c09410f217Greg Clayton                {
21949ce8969d3154e1560106cfe530444c09410f217Greg Clayton                    // Set a a pointer to this class to set our OSO DWARF file know
22049ce8969d3154e1560106cfe530444c09410f217Greg Clayton                    // that the DWARF is being used along with a debug map and that
22149ce8969d3154e1560106cfe530444c09410f217Greg Clayton                    // it will have the remapped sections that we do below.
2220e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                    SymbolFileDWARF *oso_symfile = SymbolFileDWARFDebugMap::GetSymbolFileAsSymbolFileDWARF(symbol_vendor->GetSymbolFile());
22349ce8969d3154e1560106cfe530444c09410f217Greg Clayton
22449ce8969d3154e1560106cfe530444c09410f217Greg Clayton                    if (!oso_symfile)
22549ce8969d3154e1560106cfe530444c09410f217Greg Clayton                        return NULL;
22649ce8969d3154e1560106cfe530444c09410f217Greg Clayton
22749ce8969d3154e1560106cfe530444c09410f217Greg Clayton                    ObjectFile *exe_objfile = exe_module_sp->GetObjectFile();
22849ce8969d3154e1560106cfe530444c09410f217Greg Clayton                    SymbolVendor *exe_sym_vendor = exe_module_sp->GetSymbolVendor();
22949ce8969d3154e1560106cfe530444c09410f217Greg Clayton
23049ce8969d3154e1560106cfe530444c09410f217Greg Clayton                    if (exe_objfile && exe_sym_vendor)
23149ce8969d3154e1560106cfe530444c09410f217Greg Clayton                    {
23249ce8969d3154e1560106cfe530444c09410f217Greg Clayton                        if (oso_symfile->GetNumCompileUnits() == 1)
23349ce8969d3154e1560106cfe530444c09410f217Greg Clayton                        {
23449ce8969d3154e1560106cfe530444c09410f217Greg Clayton                            oso_symfile->SetDebugMapModule(exe_module_sp);
23549ce8969d3154e1560106cfe530444c09410f217Greg Clayton                            // Set the ID of the symbol file DWARF to the index of the OSO
23649ce8969d3154e1560106cfe530444c09410f217Greg Clayton                            // shifted left by 32 bits to provide a unique prefix for any
23749ce8969d3154e1560106cfe530444c09410f217Greg Clayton                            // UserID's that get created in the symbol file.
23849ce8969d3154e1560106cfe530444c09410f217Greg Clayton                            oso_symfile->SetID (((uint64_t)m_cu_idx + 1ull) << 32ull);
23949ce8969d3154e1560106cfe530444c09410f217Greg Clayton                        }
24049ce8969d3154e1560106cfe530444c09410f217Greg Clayton                        else
24149ce8969d3154e1560106cfe530444c09410f217Greg Clayton                        {
24249ce8969d3154e1560106cfe530444c09410f217Greg Clayton                            oso_symfile->SetID (UINT64_MAX);
24349ce8969d3154e1560106cfe530444c09410f217Greg Clayton                        }
24449ce8969d3154e1560106cfe530444c09410f217Greg Clayton                    }
24549ce8969d3154e1560106cfe530444c09410f217Greg Clayton                    return symbol_vendor;
24649ce8969d3154e1560106cfe530444c09410f217Greg Clayton                }
24749ce8969d3154e1560106cfe530444c09410f217Greg Clayton            }
24849ce8969d3154e1560106cfe530444c09410f217Greg Clayton        }
24949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return NULL;
25049ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
25149ce8969d3154e1560106cfe530444c09410f217Greg Clayton
25249ce8969d3154e1560106cfe530444c09410f217Greg Claytonprotected:
25349ce8969d3154e1560106cfe530444c09410f217Greg Clayton    ModuleWP m_exe_module_wp;
25449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    const uint32_t m_cu_idx;
25549ce8969d3154e1560106cfe530444c09410f217Greg Clayton};
25649ce8969d3154e1560106cfe530444c09410f217Greg Clayton
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::Initialize()
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PluginManager::RegisterPlugin (GetPluginNameStatic(),
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                   GetPluginDescriptionStatic(),
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                   CreateInstance);
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::Terminate()
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PluginManager::UnregisterPlugin (CreateInstance);
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2720e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginNameStatic()
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2750e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    static ConstString g_name("dwarf-debugmap");
2760e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    return g_name;
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginDescriptionStatic()
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return "DWARF and DWARF3 debug symbol file reader (debug map).";
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFile*
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CreateInstance (ObjectFile* obj_file)
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return new SymbolFileDWARFDebugMap (obj_file);
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::SymbolFileDWARFDebugMap (ObjectFile* ofile) :
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFile(ofile),
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_flags(),
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_compile_unit_infos(),
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_func_indexes(),
297e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    m_glob_indexes(),
298e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    m_supports_DW_AT_APPLE_objc_complete_type (eLazyBoolCalculate)
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::~SymbolFileDWARFDebugMap()
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
307b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid
308b01000fd063629facd45044f137446fb748ee179Greg ClaytonSymbolFileDWARFDebugMap::InitializeObject()
309e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton{
310b01000fd063629facd45044f137446fb748ee179Greg Clayton    // Install our external AST source callbacks so we can complete Clang types.
311b01000fd063629facd45044f137446fb748ee179Greg Clayton    llvm::OwningPtr<clang::ExternalASTSource> ast_source_ap (
312b01000fd063629facd45044f137446fb748ee179Greg Clayton        new ClangExternalASTSourceCallbacks (SymbolFileDWARFDebugMap::CompleteTagDecl,
313b01000fd063629facd45044f137446fb748ee179Greg Clayton                                             SymbolFileDWARFDebugMap::CompleteObjCInterfaceDecl,
314e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                                             NULL,
3153fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                                             SymbolFileDWARFDebugMap::LayoutRecordType,
316b01000fd063629facd45044f137446fb748ee179Greg Clayton                                             this));
317b01000fd063629facd45044f137446fb748ee179Greg Clayton
318b01000fd063629facd45044f137446fb748ee179Greg Clayton    GetClangASTContext().SetExternalSource (ast_source_ap);
319e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton}
320e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
32249ce8969d3154e1560106cfe530444c09410f217Greg ClaytonSymbolFileDWARFDebugMap::InitOSO()
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_flags.test(kHaveInitializedOSOs))
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
326464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_flags.set(kHaveInitializedOSOs);
3287940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
3297940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    // If the object file has been stripped, there is no sense in looking further
3307940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    // as all of the debug symbols for the debug map will not be available
3317940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    if (m_obj_file->IsStripped())
3327940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        return;
3337940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
3347940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    // Also make sure the file type is some sort of executable. Core files, debug
3357940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    // info files (dSYM), object files (.o files), and stub libraries all can
3367940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    switch (m_obj_file->GetType())
3377940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    {
3387940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        case ObjectFile::eTypeInvalid:
3397940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        case ObjectFile::eTypeCoreFile:
3407940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        case ObjectFile::eTypeDebugInfo:
3417940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        case ObjectFile::eTypeObjectFile:
3427940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        case ObjectFile::eTypeStubLibrary:
3437940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        case ObjectFile::eTypeUnknown:
3447940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            return;
3457940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
3467940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        case ObjectFile::eTypeExecutable:
3477940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        case ObjectFile::eTypeDynamicLinker:
3487940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        case ObjectFile::eTypeSharedLibrary:
3497940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            break;
3507940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    }
3517940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // In order to get the abilities of this plug-in, we look at the list of
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // N_OSO entries (object files) from the symbol table and make sure that
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // these files exist and also contain valid DWARF. If we get any of that
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // then we return the abilities of the first N_OSO's DWARF.
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3577940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    Symtab* symtab = m_obj_file->GetSymtab();
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symtab)
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
360952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_MAP));
361fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::vector<uint32_t> oso_indexes;
363cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        // When a mach-o symbol is encoded, the n_type field is encoded in bits
364cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        // 23:16, and the n_desc field is encoded in bits 15:0.
365cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        //
366cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        // To find all N_OSO entries that are part of the DWARF + debug map
367cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        // we find only object file symbols with the flags value as follows:
368cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        // bits 23:16 == 0x66 (N_OSO)
369cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        // bits 15: 0 == 0x0001 (specifies this is a debug map object file)
370cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        const uint32_t k_oso_symbol_flags_value = 0x660001u;
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
372cd151697a4b4d32d8818488b793ea44712945448Greg Clayton        const uint32_t oso_index_count = symtab->AppendSymbolIndexesWithTypeAndFlagsValue(eSymbolTypeObjectFile, k_oso_symbol_flags_value, oso_indexes);
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (oso_index_count > 0)
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
376cd151697a4b4d32d8818488b793ea44712945448Greg Clayton            symtab->AppendSymbolIndexesWithType (eSymbolTypeCode, Symtab::eDebugYes, Symtab::eVisibilityAny, m_func_indexes);
377cd151697a4b4d32d8818488b793ea44712945448Greg Clayton            symtab->AppendSymbolIndexesWithType (eSymbolTypeData, Symtab::eDebugYes, Symtab::eVisibilityAny, m_glob_indexes);
378cd151697a4b4d32d8818488b793ea44712945448Greg Clayton
379cd151697a4b4d32d8818488b793ea44712945448Greg Clayton            symtab->SortSymbolIndexesByValue(m_func_indexes, true);
380cd151697a4b4d32d8818488b793ea44712945448Greg Clayton            symtab->SortSymbolIndexesByValue(m_glob_indexes, true);
381cd151697a4b4d32d8818488b793ea44712945448Greg Clayton
382464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            for (uint32_t sym_idx : m_func_indexes)
383464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            {
384464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                const Symbol *symbol = symtab->SymbolAtIndex(sym_idx);
385464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                lldb::addr_t file_addr = symbol->GetAddress().GetFileAddress();
386464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                lldb::addr_t byte_size = symbol->GetByteSize();
387464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                DebugMap::Entry debug_map_entry(file_addr, byte_size, OSOEntry(sym_idx, LLDB_INVALID_ADDRESS));
388464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                m_debug_map.Append(debug_map_entry);
389464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            }
390464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            for (uint32_t sym_idx : m_glob_indexes)
391464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            {
392464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                const Symbol *symbol = symtab->SymbolAtIndex(sym_idx);
393464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                lldb::addr_t file_addr = symbol->GetAddress().GetFileAddress();
3947940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                lldb::addr_t byte_size = symbol->GetByteSize();
395464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                DebugMap::Entry debug_map_entry(file_addr, byte_size, OSOEntry(sym_idx, LLDB_INVALID_ADDRESS));
396464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                m_debug_map.Append(debug_map_entry);
397464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            }
398464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            m_debug_map.Sort();
399464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_compile_unit_infos.resize(oso_index_count);
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (uint32_t i=0; i<oso_index_count; ++i)
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
4043cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                const uint32_t so_idx = oso_indexes[i] - 1;
4050be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                const uint32_t oso_idx = oso_indexes[i];
4063cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                const Symbol *so_symbol = symtab->SymbolAtIndex(so_idx);
4070be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                const Symbol *oso_symbol = symtab->SymbolAtIndex(oso_idx);
4080be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                if (so_symbol &&
4090be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                    oso_symbol &&
4100be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                    so_symbol->GetType() == eSymbolTypeSourceFile &&
4110be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                    oso_symbol->GetType() == eSymbolTypeObjectFile)
41277f281deb58ad655b36d6fee402730713cb985d0Greg Clayton                {
413c2fe09b1e9fb58e02b15dfc2a76dbbc9e9d36850Greg Clayton                    m_compile_unit_infos[i].so_file.SetFile(so_symbol->GetName().AsCString(), false);
4143cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                    m_compile_unit_infos[i].oso_path = oso_symbol->GetName();
4150e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                    TimeValue oso_mod_time;
4160e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                    oso_mod_time.OffsetWithSeconds(oso_symbol->GetAddress().GetOffset());
4170e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                    m_compile_unit_infos[i].oso_mod_time = oso_mod_time;
4180be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                    uint32_t sibling_idx = so_symbol->GetSiblingIndex();
4190be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                    // The sibling index can't be less that or equal to the current index "i"
4200be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                    if (sibling_idx <= i)
4210be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                    {
4220be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                        m_obj_file->GetModule()->ReportError ("N_SO in symbol with UID %u has invalid sibling in debug map, please file a bug and attach the binary listed in this error", so_symbol->GetID());
4230be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                    }
4240be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                    else
4250be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                    {
4260be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                        const Symbol* last_symbol = symtab->SymbolAtIndex (sibling_idx - 1);
4273cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                        m_compile_unit_infos[i].first_symbol_index = so_idx;
4283cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                        m_compile_unit_infos[i].last_symbol_index = sibling_idx - 1;
4290be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                        m_compile_unit_infos[i].first_symbol_id = so_symbol->GetID();
4300be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                        m_compile_unit_infos[i].last_symbol_id = last_symbol->GetID();
4310be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton
4320be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                        if (log)
4330be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                            log->Printf("Initialized OSO 0x%8.8x: file=%s", i, oso_symbol->GetName().GetCString());
4340be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                    }
43577f281deb58ad655b36d6fee402730713cb985d0Greg Clayton                }
43677f281deb58ad655b36d6fee402730713cb985d0Greg Clayton                else
43777f281deb58ad655b36d6fee402730713cb985d0Greg Clayton                {
4380be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                    if (oso_symbol == NULL)
4390be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                        m_obj_file->GetModule()->ReportError ("N_OSO symbol[%u] can't be found, please file a bug and attach the binary listed in this error", oso_idx);
4400be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                    else if (so_symbol == NULL)
4410be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                        m_obj_file->GetModule()->ReportError ("N_SO not found for N_OSO symbol[%u], please file a bug and attach the binary listed in this error", oso_idx);
4420be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                    else if (so_symbol->GetType() != eSymbolTypeSourceFile)
4430be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                        m_obj_file->GetModule()->ReportError ("N_SO has incorrect symbol type (%u) for N_OSO symbol[%u], please file a bug and attach the binary listed in this error", so_symbol->GetType(), oso_idx);
4440be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                    else if (oso_symbol->GetType() != eSymbolTypeSourceFile)
4450be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton                        m_obj_file->GetModule()->ReportError ("N_OSO has incorrect symbol type (%u) for N_OSO symbol[%u], please file a bug and attach the binary listed in this error", oso_symbol->GetType(), oso_idx);
44677f281deb58ad655b36d6fee402730713cb985d0Greg Clayton                }
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule *
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetModuleByOSOIndex (uint32_t oso_idx)
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t cu_count = GetNumCompileUnits();
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_idx < cu_count)
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetModuleByCompUnitInfo (&m_compile_unit_infos[oso_idx]);
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule *
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetModuleByCompUnitInfo (CompileUnitInfo *comp_unit_info)
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4643cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton    if (!comp_unit_info->oso_sp)
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4663cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton        auto pos = m_oso_map.find (comp_unit_info->oso_path);
4673cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton        if (pos != m_oso_map.end())
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
4693cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton            comp_unit_info->oso_sp = pos->second;
4703cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton        }
4713cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton        else
4723cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton        {
4730e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton            ObjectFile *obj_file = GetObjectFile();
4743cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton            comp_unit_info->oso_sp.reset (new OSOInfo());
4753cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton            m_oso_map[comp_unit_info->oso_path] = comp_unit_info->oso_sp;
4763cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton            const char *oso_path = comp_unit_info->oso_path.GetCString();
4779eead7dccf47e0dd97fa1283f91234ba0ab046eeGreg Clayton            FileSpec oso_file (oso_path, false);
4783cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton            ConstString oso_object;
4790e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton            if (oso_file.Exists())
4800e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton            {
4810e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                TimeValue oso_mod_time (oso_file.GetModificationTime());
4820e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                if (oso_mod_time != comp_unit_info->oso_mod_time)
4830e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                {
4840e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                    obj_file->GetModule()->ReportError ("debug map object file '%s' has changed (actual time is 0x%" PRIx64 ", debug map time is 0x%" PRIx64 ") since this executable was linked, file will be ignored",
4850e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                                                        oso_file.GetPath().c_str(),
4860e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                                                        oso_mod_time.GetAsSecondsSinceJan1_1970(),
4870e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                                                        comp_unit_info->oso_mod_time.GetAsSecondsSinceJan1_1970());
4880e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                    return NULL;
4890e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                }
4900e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton
4910e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton            }
4920e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton            else
49349ce8969d3154e1560106cfe530444c09410f217Greg Clayton            {
4943cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                const bool must_exist = true;
4953cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton
4963cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                if (!ObjectFile::SplitArchivePathWithObject (oso_path,
4973cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                                                             oso_file,
4983cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                                                             oso_object,
4993cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                                                             must_exist))
5003cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                {
5013cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                    return NULL;
5023cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                }
50349ce8969d3154e1560106cfe530444c09410f217Greg Clayton            }
5043cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton            // Always create a new module for .o files. Why? Because we
5053cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton            // use the debug map, to add new sections to each .o file and
5063cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton            // even though a .o file might not have changed, the sections
5073cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton            // that get added to the .o file can change.
5080e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton            comp_unit_info->oso_sp->module_sp.reset (new DebugMapModule (obj_file->GetModule(),
5093cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                                                                         GetCompUnitInfoIndex(comp_unit_info),
5103cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                                                                         oso_file,
5113cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                                                                         m_obj_file->GetModule()->GetArchitecture(),
5123cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                                                                         oso_object ? &oso_object : NULL,
5130e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                                                                         0,
5140e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                                                                         oso_object ? &comp_unit_info->oso_mod_time : NULL));
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
5173cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton    if (comp_unit_info->oso_sp)
5183cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton        return comp_unit_info->oso_sp->module_sp.get();
5193cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton    return NULL;
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetFileSpecForSO (uint32_t oso_idx, FileSpec &file_spec)
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_idx < m_compile_unit_infos.size())
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
52849ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (m_compile_unit_infos[oso_idx].so_file)
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
53049ce8969d3154e1560106cfe530444c09410f217Greg Clayton            file_spec = m_compile_unit_infos[oso_idx].so_file;
53149ce8969d3154e1560106cfe530444c09410f217Greg Clayton            return true;
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile *
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetObjectFileByOSOIndex (uint32_t oso_idx)
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Module *oso_module = GetModuleByOSOIndex (oso_idx);
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_module)
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_module->GetObjectFile();
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF *
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFile (const SymbolContext& sc)
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompileUnitInfo *comp_unit_info = GetCompUnitInfo (sc);
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (comp_unit_info)
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetSymbolFileByCompUnitInfo (comp_unit_info);
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile *
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetObjectFileByCompUnitInfo (CompileUnitInfo *comp_unit_info)
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Module *oso_module = GetModuleByCompUnitInfo (comp_unit_info);
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_module)
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_module->GetObjectFile();
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
566444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton
567444e35b5fdf15a25a427285650f06f1390e62c75Greg Claytonuint32_t
568444e35b5fdf15a25a427285650f06f1390e62c75Greg ClaytonSymbolFileDWARFDebugMap::GetCompUnitInfoIndex (const CompileUnitInfo *comp_unit_info)
569444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton{
570444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    if (!m_compile_unit_infos.empty())
571444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    {
572444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton        const CompileUnitInfo *first_comp_unit_info = &m_compile_unit_infos.front();
573444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton        const CompileUnitInfo *last_comp_unit_info = &m_compile_unit_infos.back();
574444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton        if (first_comp_unit_info <= comp_unit_info && comp_unit_info <= last_comp_unit_info)
575444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton            return comp_unit_info - first_comp_unit_info;
576444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    }
577444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    return UINT32_MAX;
578444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton}
579444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF *
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFileByOSOIndex (uint32_t oso_idx)
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_idx < m_compile_unit_infos.size())
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[oso_idx]);
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF *
5890e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonSymbolFileDWARFDebugMap::GetSymbolFileAsSymbolFileDWARF (SymbolFile *sym_file)
5900e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton{
5910e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    if (sym_file && sym_file->GetPluginName() == SymbolFileDWARF::GetPluginNameStatic())
5920e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        return (SymbolFileDWARF *)sym_file;
5930e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    return NULL;
5940e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton}
5950e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton
5960e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonSymbolFileDWARF *
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFileByCompUnitInfo (CompileUnitInfo *comp_unit_info)
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
59949ce8969d3154e1560106cfe530444c09410f217Greg Clayton    Module *oso_module = GetModuleByCompUnitInfo (comp_unit_info);
60049ce8969d3154e1560106cfe530444c09410f217Greg Clayton    if (oso_module)
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
60249ce8969d3154e1560106cfe530444c09410f217Greg Clayton        SymbolVendor *sym_vendor = oso_module->GetSymbolVendor();
60349ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (sym_vendor)
6040e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton            return GetSymbolFileAsSymbolFileDWARF (sym_vendor->GetSymbolFile());
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
610d0b7cfa22722fdaf4111a61d6eeb02a587710e16Sean CallananSymbolFileDWARFDebugMap::CalculateAbilities ()
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // In order to get the abilities of this plug-in, we look at the list of
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // N_OSO entries (object files) from the symbol table and make sure that
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // these files exist and also contain valid DWARF. If we get any of that
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // then we return the abilities of the first N_OSO's DWARF.
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t oso_index_count = GetNumCompileUnits();
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_index_count > 0)
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
62049ce8969d3154e1560106cfe530444c09410f217Greg Clayton        InitOSO();
62149ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (!m_compile_unit_infos.empty())
6227940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        {
6237940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton            return SymbolFile::CompileUnits    |
6247940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                   SymbolFile::Functions       |
6257940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                   SymbolFile::Blocks          |
6267940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                   SymbolFile::GlobalVariables |
6277940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                   SymbolFile::LocalVariables  |
6287940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                   SymbolFile::VariableTypes   |
6297940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton                   SymbolFile::LineTables      ;
6307940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton        }
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetNumCompileUnits()
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    InitOSO ();
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_compile_unit_infos.size();
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitAtIndex(uint32_t cu_idx)
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompUnitSP comp_unit_sp;
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t cu_count = GetNumCompileUnits();
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cu_idx < cu_count)
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
6513cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton        Module *oso_module = GetModuleByCompUnitInfo (&m_compile_unit_infos[cu_idx]);
6523cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton        if (oso_module)
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
65449ce8969d3154e1560106cfe530444c09410f217Greg Clayton            FileSpec so_file_spec;
65549ce8969d3154e1560106cfe530444c09410f217Greg Clayton            if (GetFileSpecForSO (cu_idx, so_file_spec))
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
657464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                // User zero as the ID to match the compile unit at offset
658464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                // zero in each .o file since each .o file can only have
659464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                // one compile unit for now.
660464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                lldb::user_id_t cu_id = 0;
661464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                m_compile_unit_infos[cu_idx].compile_unit_sp.reset(new CompileUnit (m_obj_file->GetModule(),
662464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                                                                    NULL,
663464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                                                                    so_file_spec,
664464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                                                                    cu_id,
665464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                                                                    eLanguageTypeUnknown));
66649ce8969d3154e1560106cfe530444c09410f217Greg Clayton
6673cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                if (m_compile_unit_infos[cu_idx].compile_unit_sp)
66849ce8969d3154e1560106cfe530444c09410f217Greg Clayton                {
669ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton                    // Let our symbol vendor know about this compile unit
670464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                    m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex (cu_idx, m_compile_unit_infos[cu_idx].compile_unit_sp);
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
6743cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton        comp_unit_sp = m_compile_unit_infos[cu_idx].compile_unit_sp;
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return comp_unit_sp;
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CompileUnitInfo *
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetCompUnitInfo (const SymbolContext& sc)
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t cu_count = GetNumCompileUnits();
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (uint32_t i=0; i<cu_count; ++i)
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
6863cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton        if (sc.comp_unit == m_compile_unit_infos[i].compile_unit_sp.get())
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return &m_compile_unit_infos[i];
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69249ce8969d3154e1560106cfe530444c09410f217Greg Clayton
6933cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Claytonsize_t
6943cf7ab5462467121b4ac6cde09ee994030dad0c5Greg ClaytonSymbolFileDWARFDebugMap::GetCompUnitInfosForModule (const lldb_private::Module *module, std::vector<CompileUnitInfo *>& cu_infos)
69549ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
69649ce8969d3154e1560106cfe530444c09410f217Greg Clayton    const uint32_t cu_count = GetNumCompileUnits();
69749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    for (uint32_t i=0; i<cu_count; ++i)
69849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
6993cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton        if (module == GetModuleByCompUnitInfo (&m_compile_unit_infos[i]))
7003cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton            cu_infos.push_back (&m_compile_unit_infos[i]);
70149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
7023cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton    return cu_infos.size();
70349ce8969d3154e1560106cfe530444c09410f217Greg Clayton}
70449ce8969d3154e1560106cfe530444c09410f217Greg Clayton
70549ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb::LanguageType
70649ce8969d3154e1560106cfe530444c09410f217Greg ClaytonSymbolFileDWARFDebugMap::ParseCompileUnitLanguage (const SymbolContext& sc)
70749ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
70849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
70949ce8969d3154e1560106cfe530444c09410f217Greg Clayton    if (oso_dwarf)
71049ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return oso_dwarf->ParseCompileUnitLanguage (sc);
71149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    return eLanguageTypeUnknown;
71249ce8969d3154e1560106cfe530444c09410f217Greg Clayton}
71349ce8969d3154e1560106cfe530444c09410f217Greg Clayton
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitFunctions (const SymbolContext& sc)
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseCompileUnitFunctions (sc);
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitLineTable (const SymbolContext& sc)
72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseCompileUnitLineTable (sc);
72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList &support_files)
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseCompileUnitSupportFiles (sc, support_files);
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseFunctionBlocks (const SymbolContext& sc)
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseFunctionBlocks (sc);
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseTypes (const SymbolContext& sc)
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return oso_dwarf->ParseTypes (sc);
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseVariablesForContext (const SymbolContext& sc)
76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_dwarf)
76749ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return oso_dwarf->ParseVariablesForContext (sc);
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerType*
77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveTypeUID(lldb::user_id_t type_uid)
77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
776444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    const uint64_t oso_idx = GetOSOIndexFromUserID (type_uid);
777444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
778444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    if (oso_dwarf)
779464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        return oso_dwarf->ResolveTypeUID (type_uid);
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78352f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
78452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonSymbolFileDWARFDebugMap::ResolveClangOpaqueTypeDefinition (ClangASTType& clang_type)
785462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{
786462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    // We have a struct/union/class/enum that needs to be fully resolved.
78752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
788462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton}
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveSymbolContext (const Address& exe_so_addr, uint32_t resolve_scope, SymbolContext& sc)
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t resolved_flags = 0;
7947940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton    Symtab* symtab = m_obj_file->GetSymtab();
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symtab)
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const addr_t exe_file_addr = exe_so_addr.GetFileAddress();
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
799464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        const DebugMap::Entry *debug_map_entry = m_debug_map.FindEntryThatContains (exe_file_addr);
800464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        if (debug_map_entry)
80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
803464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            sc.symbol = symtab->SymbolAtIndex(debug_map_entry->data.GetExeSymbolIndex());
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
805464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            if (sc.symbol != NULL)
806464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            {
807464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                resolved_flags |= eSymbolContextSymbol;
80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
809464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                uint32_t oso_idx = 0;
810464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithID (sc.symbol->GetID(), &oso_idx);
811464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                if (comp_unit_info)
812464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                {
813d7d583f2e384a8d4d9c2fac0a10b812fd9fb0926Jim Ingham                    comp_unit_info->GetFileRangeMap(this);
814464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                    Module *oso_module = GetModuleByCompUnitInfo (comp_unit_info);
815464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                    if (oso_module)
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
817464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                        lldb::addr_t oso_file_addr = exe_file_addr - debug_map_entry->GetRangeBase() + debug_map_entry->data.GetOSOFileAddress();
818464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                        Address oso_so_addr;
819464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                        if (oso_module->ResolveFileAddress(oso_file_addr, oso_so_addr))
820464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                        {
821464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                            resolved_flags |= oso_module->GetSymbolVendor()->ResolveSymbolContext (oso_so_addr, resolve_scope, sc);
822464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                        }
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return resolved_flags;
82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveSymbolContext (const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
83549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    const uint32_t initial = sc_list.GetSize();
83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t cu_count = GetNumCompileUnits();
83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (uint32_t i=0; i<cu_count; ++i)
83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
84049ce8969d3154e1560106cfe530444c09410f217Greg Clayton        // If we are checking for inlines, then we need to look through all
84149ce8969d3154e1560106cfe530444c09410f217Greg Clayton        // compile units no matter if "file_spec" matches.
84249ce8969d3154e1560106cfe530444c09410f217Greg Clayton        bool resolve = check_inlines;
84349ce8969d3154e1560106cfe530444c09410f217Greg Clayton
84449ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (!resolve)
84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
84649ce8969d3154e1560106cfe530444c09410f217Greg Clayton            FileSpec so_file_spec;
84749ce8969d3154e1560106cfe530444c09410f217Greg Clayton            if (GetFileSpecForSO (i, so_file_spec))
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
84949ce8969d3154e1560106cfe530444c09410f217Greg Clayton                // Match the full path if the incoming file_spec has a directory (not just a basename)
85049ce8969d3154e1560106cfe530444c09410f217Greg Clayton                const bool full_match = file_spec.GetDirectory();
85149ce8969d3154e1560106cfe530444c09410f217Greg Clayton                resolve = FileSpec::Equal (file_spec, so_file_spec, full_match);
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
85449ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (resolve)
85549ce8969d3154e1560106cfe530444c09410f217Greg Clayton        {
85649ce8969d3154e1560106cfe530444c09410f217Greg Clayton            SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (i);
85749ce8969d3154e1560106cfe530444c09410f217Greg Clayton            if (oso_dwarf)
85849ce8969d3154e1560106cfe530444c09410f217Greg Clayton                oso_dwarf->ResolveSymbolContext(file_spec, line, check_inlines, resolve_scope, sc_list);
85949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        }
86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial;
86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::PrivateFindGlobalVariables
86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString &name,
8680fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan    const ClangNamespaceDecl *namespace_decl,
86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const std::vector<uint32_t> &indexes,   // Indexes into the symbol table that match "name"
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t max_matches,
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    VariableList& variables
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t original_size = variables.GetSize();
87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t match_count = indexes.size();
87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (size_t i=0; i<match_count; ++i)
87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t oso_idx;
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithIndex (indexes[i], &oso_idx);
88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (comp_unit_info)
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (oso_dwarf)
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
8850fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan                if (oso_dwarf->FindGlobalVariables(name, namespace_decl, true, max_matches, variables))
88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (variables.GetSize() > max_matches)
88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        break;
88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return variables.GetSize() - original_size;
89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
8950fcec13c6639ab49216fa9447b25888b7bc9ff59Sean CallananSymbolFileDWARFDebugMap::FindGlobalVariables (const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables)
89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If we aren't appending the results to this list, then clear the list
89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!append)
90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        variables.Clear();
90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Remember how many variables are in the list before we search in case
90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we are appending the results to a variable list.
90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t original_size = variables.GetSize();
90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
906e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    uint32_t total_matches = 0;
907e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    SymbolFileDWARF *oso_dwarf;
908e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9100fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan        const uint32_t oso_matches = oso_dwarf->FindGlobalVariables (name,
9110fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan                                                                     namespace_decl,
912e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                                                                     true,
913e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                                                                     max_matches,
914e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                                                                     variables);
915e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton        if (oso_matches > 0)
91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
917e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            total_matches += oso_matches;
918e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton
919e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            // Are we getting all matches?
920e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            if (max_matches == UINT32_MAX)
921e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                continue;   // Yep, continue getting everything
922e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton
923e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            // If we have found enough matches, lets get out
924e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            if (max_matches >= total_matches)
925e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                break;
926e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton
927e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            // Update the max matches for any subsequent calls to find globals
928e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            // in any other object files with DWARF
929e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            max_matches -= oso_matches;
93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Return the number of variable that were appended to the list
93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return variables.GetSize() - original_size;
93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::FindGlobalVariables (const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
940e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    // If we aren't appending the results to this list, then clear the list
941e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    if (!append)
942e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton        variables.Clear();
943e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton
944e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    // Remember how many variables are in the list before we search in case
945e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    // we are appending the results to a variable list.
946e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    const uint32_t original_size = variables.GetSize();
947e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton
948e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    uint32_t total_matches = 0;
949e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    SymbolFileDWARF *oso_dwarf;
950e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
951e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    {
952e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton        const uint32_t oso_matches = oso_dwarf->FindGlobalVariables (regex,
953e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                                                                     true,
954e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                                                                     max_matches,
955e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                                                                     variables);
956e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton        if (oso_matches > 0)
957e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton        {
958e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            total_matches += oso_matches;
959e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton
960e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            // Are we getting all matches?
961e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            if (max_matches == UINT32_MAX)
962e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                continue;   // Yep, continue getting everything
963e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton
964e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            // If we have found enough matches, lets get out
965e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            if (max_matches >= total_matches)
966e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton                break;
967e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton
968e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            // Update the max matches for any subsequent calls to find globals
969e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            // in any other object files with DWARF
970e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton            max_matches -= oso_matches;
971e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton        }
972e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    }
973e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    // Return the number of variable that were appended to the list
974e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton    return variables.GetSize() - original_size;
97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
9797c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::SymbolContainsSymbolWithIndex (uint32_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info)
98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t symbol_idx = *symbol_idx_ptr;
98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9837c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    if (symbol_idx < comp_unit_info->first_symbol_index)
9847c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton        return -1;
9857c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
9867c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    if (symbol_idx <= comp_unit_info->last_symbol_index)
9877c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton        return 0;
9887c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
9897c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    return 1;
9907c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton}
9917c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
9927c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
9937c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Claytonint
9947c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::SymbolContainsSymbolWithID (user_id_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info)
9957c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton{
9967c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    const user_id_t symbol_id = *symbol_idx_ptr;
9977c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
99849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    if (symbol_id < comp_unit_info->first_symbol_id)
99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return -1;
100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
100149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    if (symbol_id <= comp_unit_info->last_symbol_id)
100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 1;
100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CompileUnitInfo*
100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithIndex (uint32_t symbol_idx, uint32_t *oso_idx_ptr)
101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t oso_index_count = m_compile_unit_infos.size();
101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompileUnitInfo *comp_unit_info = NULL;
101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_index_count)
101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1015b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        comp_unit_info = (CompileUnitInfo*)bsearch(&symbol_idx,
1016b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                   &m_compile_unit_infos[0],
1017b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                   m_compile_unit_infos.size(),
1018b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                   sizeof(CompileUnitInfo),
1019b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                   (ComparisonFunction)SymbolContainsSymbolWithIndex);
102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (oso_idx_ptr)
102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (comp_unit_info != NULL)
102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0];
102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *oso_idx_ptr = UINT32_MAX;
102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return comp_unit_info;
103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10327c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::CompileUnitInfo*
10337c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithID (user_id_t symbol_id, uint32_t *oso_idx_ptr)
10347c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton{
10357c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    const uint32_t oso_index_count = m_compile_unit_infos.size();
10367c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    CompileUnitInfo *comp_unit_info = NULL;
10377c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    if (oso_index_count)
10387c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    {
1039b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        comp_unit_info = (CompileUnitInfo*)::bsearch (&symbol_id,
1040b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                      &m_compile_unit_infos[0],
1041b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                      m_compile_unit_infos.size(),
1042b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                      sizeof(CompileUnitInfo),
1043b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                      (ComparisonFunction)SymbolContainsSymbolWithID);
10447c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    }
10457c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
10467c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    if (oso_idx_ptr)
10477c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    {
10487c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton        if (comp_unit_info != NULL)
10497c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0];
10507c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton        else
10517c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            *oso_idx_ptr = UINT32_MAX;
10527c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    }
10537c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton    return comp_unit_info;
10547c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton}
10557c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
10567c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton
105788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Claytonstatic void
10583508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonRemoveFunctionsWithModuleNotEqualTo (const ModuleSP &module_sp, SymbolContextList &sc_list, uint32_t start_idx)
105988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton{
106088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // We found functions in .o files. Not all functions in the .o files
106188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // will have made it into the final output file. The ones that did
106288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // make it into the final output file will have a section whose module
106388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // matches the module from the ObjectFile for this SymbolFile. When
106488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // the modules don't match, then we have something that was in a
106588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    // .o file, but doesn't map to anything in the final executable.
106688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    uint32_t i=start_idx;
106788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    while (i < sc_list.GetSize())
106888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    {
106988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        SymbolContext sc;
107088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        sc_list.GetContextAtIndex(i, sc);
107188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        if (sc.function)
107288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        {
10733508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            const SectionSP section_sp (sc.function->GetAddressRange().GetBaseAddress().GetSection());
10743508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            if (section_sp->GetModule() != module_sp)
107588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton            {
107688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton                sc_list.RemoveContextAtIndex(i);
107788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton                continue;
107888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton            }
107988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        }
108088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        ++i;
108188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton    }
108288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton}
108388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton
108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
1085302d78c71902398ce1f422bd09216dd53a6abb88Sean CallananSymbolFileDWARFDebugMap::FindFunctions(const ConstString &name, const ClangNamespaceDecl *namespace_decl, uint32_t name_type_mask, bool include_inlines, bool append, SymbolContextList& sc_list)
108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__,
108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        "SymbolFileDWARFDebugMap::FindFunctions (name = %s)",
108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        name.GetCString());
109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t initial_size = 0;
109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (append)
109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        initial_size = sc_list.GetSize();
109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sc_list.Clear();
109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10977241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    uint32_t oso_idx = 0;
10987241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    SymbolFileDWARF *oso_dwarf;
10997241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL)
110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
110188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        uint32_t sc_idx = sc_list.GetSize();
1102302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan        if (oso_dwarf->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, true, sc_list))
110388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        {
110488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton            RemoveFunctionsWithModuleNotEqualTo (m_obj_file->GetModule(), sc_list, sc_idx);
110588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        }
110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
1113302d78c71902398ce1f422bd09216dd53a6abb88Sean CallananSymbolFileDWARFDebugMap::FindFunctions (const RegularExpression& regex, bool include_inlines, bool append, SymbolContextList& sc_list)
111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__,
111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        "SymbolFileDWARFDebugMap::FindFunctions (regex = '%s')",
111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        regex.GetText());
111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11197241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    uint32_t initial_size = 0;
11207241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    if (append)
11217241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton        initial_size = sc_list.GetSize();
11227241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    else
11237241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton        sc_list.Clear();
11247241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton
11257241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    uint32_t oso_idx = 0;
11267241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    SymbolFileDWARF *oso_dwarf;
11277241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL)
11287241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    {
112988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        uint32_t sc_idx = sc_list.GetSize();
113088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton
1131302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan        if (oso_dwarf->FindFunctions(regex, include_inlines, true, sc_list))
113288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        {
113388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton            RemoveFunctionsWithModuleNotEqualTo (m_obj_file->GetModule(), sc_list, sc_idx);
113488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton        }
11357241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    }
11367241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton
11377241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton    return sc_list.GetSize() - initial_size;
113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1140a8b56238ce138e70433a0ce0b4218c9257beae38Greg Claytonsize_t
1141a8b56238ce138e70433a0ce0b4218c9257beae38Greg ClaytonSymbolFileDWARFDebugMap::GetTypes (SymbolContextScope *sc_scope,
1142a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton                                   uint32_t type_mask,
1143a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton                                   TypeList &type_list)
1144a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton{
1145a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    Timer scoped_timer (__PRETTY_FUNCTION__,
1146a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton                        "SymbolFileDWARFDebugMap::GetTypes (type_mask = 0x%8.8x)",
1147a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton                        type_mask);
1148a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
1149a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
1150a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    uint32_t initial_size = type_list.GetSize();
1151a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    SymbolFileDWARF *oso_dwarf = NULL;
1152a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    if (sc_scope)
1153a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    {
1154a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        SymbolContext sc;
1155a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        sc_scope->CalculateSymbolContext(&sc);
1156a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
1157a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        CompileUnitInfo *cu_info = GetCompUnitInfo (sc);
1158a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        if (cu_info)
1159a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        {
1160a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton            oso_dwarf = GetSymbolFileByCompUnitInfo (cu_info);
1161a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton            if (oso_dwarf)
1162a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton                oso_dwarf->GetTypes (sc_scope, type_mask, type_list);
1163a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        }
1164a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    }
1165a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    else
1166a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    {
1167a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        uint32_t oso_idx = 0;
1168a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL)
1169a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        {
1170a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton            oso_dwarf->GetTypes (sc_scope, type_mask, type_list);
1171a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        }
1172a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    }
1173a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    return type_list.GetSize() - initial_size;
1174a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton}
1175a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
1176a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
117795e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg ClaytonTypeSP
1178cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg ClaytonSymbolFileDWARFDebugMap::FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &die_decl_ctx)
117995e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton{
118095e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    TypeSP type_sp;
118195e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    SymbolFileDWARF *oso_dwarf;
118295e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
118395e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    {
1184cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton        type_sp = oso_dwarf->FindDefinitionTypeForDWARFDeclContext (die_decl_ctx);
118595e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton        if (type_sp)
118695e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton            break;
118795e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    }
118895e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton    return type_sp;
118995e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton}
1190960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
119177917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton
1192e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton
1193e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Claytonbool
1194e6b976d3f1c42f18c85c87cb179954af7df5a542Greg ClaytonSymbolFileDWARFDebugMap::Supports_DW_AT_APPLE_objc_complete_type (SymbolFileDWARF *skip_dwarf_oso)
1195e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton{
1196e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolCalculate)
1197e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    {
1198e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolNo;
1199e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        SymbolFileDWARF *oso_dwarf;
1200e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
1201e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        {
1202e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton            if (skip_dwarf_oso != oso_dwarf && oso_dwarf->Supports_DW_AT_APPLE_objc_complete_type(NULL))
1203e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton            {
1204e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton                m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes;
1205e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton                break;
1206e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton            }
1207e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        }
1208e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    }
1209e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton    return m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolYes;
1210e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton}
1211e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton
121277917228890a15d40ec6dd28c5865dd1b7895053Greg ClaytonTypeSP
1213e6b976d3f1c42f18c85c87cb179954af7df5a542Greg ClaytonSymbolFileDWARFDebugMap::FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry *die,
1214e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton                                                               const ConstString &type_name,
1215e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton                                                               bool must_be_implementation)
121677917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton{
121777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton    TypeSP type_sp;
121877917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton    SymbolFileDWARF *oso_dwarf;
121977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton    for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
122077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton    {
1221e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton        type_sp = oso_dwarf->FindCompleteObjCDefinitionTypeForDIE (die, type_name, must_be_implementation);
122277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton        if (type_sp)
122377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton            break;
122477917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton    }
122577917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton    return type_sp;
122677917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton}
122777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton
1228960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Claytonuint32_t
12291924e2408687e0ee41976010c6b9410bdd01270dGreg ClaytonSymbolFileDWARFDebugMap::FindTypes
12301924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton(
12311924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    const SymbolContext& sc,
12320fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan    const ConstString &name,
12330fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan    const ClangNamespaceDecl *namespace_decl,
12341924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    bool append,
12351924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    uint32_t max_matches,
12361924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    TypeList& types
12371924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton)
1238960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
1239960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton    if (!append)
1240960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        types.Clear();
12411924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton
12421924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    const uint32_t initial_types_size = types.GetSize();
12431924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    SymbolFileDWARF *oso_dwarf;
12441924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton
12451924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    if (sc.comp_unit)
12461924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    {
12471924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton        oso_dwarf = GetSymbolFile (sc);
12481924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton        if (oso_dwarf)
12490fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan            return oso_dwarf->FindTypes (sc, name, namespace_decl, append, max_matches, types);
12501924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    }
12511924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    else
12521924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    {
12531924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton        uint32_t oso_idx = 0;
12541924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton        while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL)
12550fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan            oso_dwarf->FindTypes (sc, name, namespace_decl, append, max_matches, types);
12561924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    }
12571924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton
12581924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton    return types.GetSize() - initial_types_size;
1259960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
1260960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t
126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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)
126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (oso_dwarf)
126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return oso_dwarf->FindTypes (sc, regex, append, max_matches, encoding, udt_uid, types);
126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return 0;
126924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1271d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton
12726916e358c9725b75ed91f31236c147f26c9af10eGreg ClaytonClangNamespaceDecl
1273d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg ClaytonSymbolFileDWARFDebugMap::FindNamespace (const lldb_private::SymbolContext& sc,
12740fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan                                        const lldb_private::ConstString &name,
12750fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan                                        const ClangNamespaceDecl *parent_namespace_decl)
1276d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton{
12776916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    ClangNamespaceDecl matching_namespace;
1278d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    SymbolFileDWARF *oso_dwarf;
1279d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton
1280d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    if (sc.comp_unit)
1281d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    {
1282d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton        oso_dwarf = GetSymbolFile (sc);
1283d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton        if (oso_dwarf)
12840fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan            matching_namespace = oso_dwarf->FindNamespace (sc, name, parent_namespace_decl);
1285d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    }
1286d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    else
1287d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    {
1288d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton        for (uint32_t oso_idx = 0;
1289d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton             ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL);
1290d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton             ++oso_idx)
1291d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton        {
12920fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan            matching_namespace = oso_dwarf->FindNamespace (sc, name, parent_namespace_decl);
1293d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton
1294d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton            if (matching_namespace)
1295d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton                break;
1296d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton        }
1297d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    }
1298d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton
1299d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton    return matching_namespace;
1300d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton}
1301d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton
130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// PluginInterface protocol
130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
13050e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString
130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginName()
130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetPluginNameStatic();
130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginVersion()
131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 1;
131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
131749ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb::CompUnitSP
131849ce8969d3154e1560106cfe530444c09410f217Greg ClaytonSymbolFileDWARFDebugMap::GetCompileUnit (SymbolFileDWARF *oso_dwarf)
1319ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton{
132049ce8969d3154e1560106cfe530444c09410f217Greg Clayton    if (oso_dwarf)
1321ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    {
132249ce8969d3154e1560106cfe530444c09410f217Greg Clayton        const uint32_t cu_count = GetNumCompileUnits();
132349ce8969d3154e1560106cfe530444c09410f217Greg Clayton        for (uint32_t cu_idx=0; cu_idx<cu_count; ++cu_idx)
1324ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        {
132549ce8969d3154e1560106cfe530444c09410f217Greg Clayton            SymbolFileDWARF *oso_symfile = GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[cu_idx]);
132649ce8969d3154e1560106cfe530444c09410f217Greg Clayton            if (oso_symfile == oso_dwarf)
1327ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            {
13283cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                if (!m_compile_unit_infos[cu_idx].compile_unit_sp)
13293cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                    m_compile_unit_infos[cu_idx].compile_unit_sp = ParseCompileUnitAtIndex (cu_idx);
133049ce8969d3154e1560106cfe530444c09410f217Greg Clayton
13313cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                return m_compile_unit_infos[cu_idx].compile_unit_sp;
1332ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            }
133349ce8969d3154e1560106cfe530444c09410f217Greg Clayton        }
133449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
133549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    assert(!"this shouldn't happen");
133649ce8969d3154e1560106cfe530444c09410f217Greg Clayton    return lldb::CompUnitSP();
133749ce8969d3154e1560106cfe530444c09410f217Greg Clayton}
133849ce8969d3154e1560106cfe530444c09410f217Greg Clayton
1339464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonSymbolFileDWARFDebugMap::CompileUnitInfo *
1340464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonSymbolFileDWARFDebugMap::GetCompileUnitInfo (SymbolFileDWARF *oso_dwarf)
1341464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{
1342464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    if (oso_dwarf)
1343464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    {
1344464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        const uint32_t cu_count = GetNumCompileUnits();
1345464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        for (uint32_t cu_idx=0; cu_idx<cu_count; ++cu_idx)
1346464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        {
1347464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            SymbolFileDWARF *oso_symfile = GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[cu_idx]);
1348464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            if (oso_symfile == oso_dwarf)
1349464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            {
1350464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                return &m_compile_unit_infos[cu_idx];
1351464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            }
1352464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        }
1353464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    }
1354464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    return NULL;
1355464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton}
1356464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
135749ce8969d3154e1560106cfe530444c09410f217Greg Clayton
135849ce8969d3154e1560106cfe530444c09410f217Greg Claytonvoid
135949ce8969d3154e1560106cfe530444c09410f217Greg ClaytonSymbolFileDWARFDebugMap::SetCompileUnit (SymbolFileDWARF *oso_dwarf, const CompUnitSP &cu_sp)
136049ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
136149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    if (oso_dwarf)
136249ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
136349ce8969d3154e1560106cfe530444c09410f217Greg Clayton        const uint32_t cu_count = GetNumCompileUnits();
136449ce8969d3154e1560106cfe530444c09410f217Greg Clayton        for (uint32_t cu_idx=0; cu_idx<cu_count; ++cu_idx)
136549ce8969d3154e1560106cfe530444c09410f217Greg Clayton        {
136649ce8969d3154e1560106cfe530444c09410f217Greg Clayton            SymbolFileDWARF *oso_symfile = GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[cu_idx]);
136749ce8969d3154e1560106cfe530444c09410f217Greg Clayton            if (oso_symfile == oso_dwarf)
1368ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            {
13693cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                if (m_compile_unit_infos[cu_idx].compile_unit_sp)
137049ce8969d3154e1560106cfe530444c09410f217Greg Clayton                {
13713cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                    assert (m_compile_unit_infos[cu_idx].compile_unit_sp.get() == cu_sp.get());
137249ce8969d3154e1560106cfe530444c09410f217Greg Clayton                }
137349ce8969d3154e1560106cfe530444c09410f217Greg Clayton                else
137449ce8969d3154e1560106cfe530444c09410f217Greg Clayton                {
13753cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton                    m_compile_unit_infos[cu_idx].compile_unit_sp = cu_sp;
137649ce8969d3154e1560106cfe530444c09410f217Greg Clayton                    m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(cu_idx, cu_sp);
137749ce8969d3154e1560106cfe530444c09410f217Greg Clayton                }
1378ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            }
1379ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        }
1380ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    }
1381ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton}
1382ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton
1383b01000fd063629facd45044f137446fb748ee179Greg Clayton
1384b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid
1385b01000fd063629facd45044f137446fb748ee179Greg ClaytonSymbolFileDWARFDebugMap::CompleteTagDecl (void *baton, clang::TagDecl *decl)
1386b01000fd063629facd45044f137446fb748ee179Greg Clayton{
1387b01000fd063629facd45044f137446fb748ee179Greg Clayton    SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton;
138852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl);
1389b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type)
1390b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
1391b01000fd063629facd45044f137446fb748ee179Greg Clayton        SymbolFileDWARF *oso_dwarf;
1392b01000fd063629facd45044f137446fb748ee179Greg Clayton
1393b01000fd063629facd45044f137446fb748ee179Greg Clayton        for (uint32_t oso_idx = 0; ((oso_dwarf = symbol_file_dwarf->GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
1394b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
1395b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (oso_dwarf->HasForwardDeclForClangType (clang_type))
1396b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
1397b01000fd063629facd45044f137446fb748ee179Greg Clayton                oso_dwarf->ResolveClangOpaqueTypeDefinition (clang_type);
1398b01000fd063629facd45044f137446fb748ee179Greg Clayton                return;
1399b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
1400b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
1401b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
1402b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1403b01000fd063629facd45044f137446fb748ee179Greg Clayton
1404b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid
1405b01000fd063629facd45044f137446fb748ee179Greg ClaytonSymbolFileDWARFDebugMap::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl)
1406b01000fd063629facd45044f137446fb748ee179Greg Clayton{
1407b01000fd063629facd45044f137446fb748ee179Greg Clayton    SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton;
140852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl);
1409b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type)
1410b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
1411b01000fd063629facd45044f137446fb748ee179Greg Clayton        SymbolFileDWARF *oso_dwarf;
1412b01000fd063629facd45044f137446fb748ee179Greg Clayton
1413b01000fd063629facd45044f137446fb748ee179Greg Clayton        for (uint32_t oso_idx = 0; ((oso_dwarf = symbol_file_dwarf->GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
1414b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
1415b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (oso_dwarf->HasForwardDeclForClangType (clang_type))
1416b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
1417b01000fd063629facd45044f137446fb748ee179Greg Clayton                oso_dwarf->ResolveClangOpaqueTypeDefinition (clang_type);
1418b01000fd063629facd45044f137446fb748ee179Greg Clayton                return;
1419b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
1420b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
1421b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
1422b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1423b01000fd063629facd45044f137446fb748ee179Greg Clayton
14243fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Claytonbool
14253fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg ClaytonSymbolFileDWARFDebugMap::LayoutRecordType (void *baton,
14263fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                                           const clang::RecordDecl *record_decl,
14273fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                                           uint64_t &size,
14283fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                                           uint64_t &alignment,
14293fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                                           llvm::DenseMap <const clang::FieldDecl *, uint64_t> &field_offsets,
14303fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                                           llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
14313fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton                                           llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets)
14323fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton{
14333fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton;
14343fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    SymbolFileDWARF *oso_dwarf;
14353fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    for (uint32_t oso_idx = 0; ((oso_dwarf = symbol_file_dwarf->GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
14363fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    {
14373fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton        if (oso_dwarf->LayoutRecordType (record_decl, size, alignment, field_offsets, base_offsets, vbase_offsets))
14383fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton            return true;
14393fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    }
14403fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton    return false;
14413fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton}
14423fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton
14433fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton
14443fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton
1445444e35b5fdf15a25a427285650f06f1390e62c75Greg Claytonclang::DeclContext*
1446444e35b5fdf15a25a427285650f06f1390e62c75Greg ClaytonSymbolFileDWARFDebugMap::GetClangDeclContextContainingTypeUID (lldb::user_id_t type_uid)
1447444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton{
1448444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    const uint64_t oso_idx = GetOSOIndexFromUserID (type_uid);
1449444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
1450444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    if (oso_dwarf)
1451444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton        return oso_dwarf->GetClangDeclContextContainingTypeUID (type_uid);
1452444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    return NULL;
1453444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton}
1454444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton
1455444e35b5fdf15a25a427285650f06f1390e62c75Greg Claytonclang::DeclContext*
1456444e35b5fdf15a25a427285650f06f1390e62c75Greg ClaytonSymbolFileDWARFDebugMap::GetClangDeclContextForTypeUID (const lldb_private::SymbolContext &sc, lldb::user_id_t type_uid)
1457444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton{
1458444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    const uint64_t oso_idx = GetOSOIndexFromUserID (type_uid);
1459444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
1460444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    if (oso_dwarf)
1461444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton        return oso_dwarf->GetClangDeclContextForTypeUID (sc, type_uid);
1462444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton    return NULL;
1463444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton}
1464444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton
1465464a5063bc59755cb6ec063d0b2491097302d2abGreg Claytonbool
1466464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonSymbolFileDWARFDebugMap::AddOSOFileRange (CompileUnitInfo *cu_info,
1467464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                          lldb::addr_t exe_file_addr,
1468464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                          lldb::addr_t oso_file_addr,
1469464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                                          lldb::addr_t oso_byte_size)
1470464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{
1471464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    const uint32_t debug_map_idx = m_debug_map.FindEntryIndexThatContains(exe_file_addr);
1472464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    if (debug_map_idx != UINT32_MAX)
1473464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    {
1474464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        DebugMap::Entry *debug_map_entry = m_debug_map.FindEntryThatContains(exe_file_addr);
1475464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        debug_map_entry->data.SetOSOFileAddress(oso_file_addr);
1476464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        cu_info->file_range_map.Append(FileRangeMap::Entry(oso_file_addr, oso_byte_size, exe_file_addr));
1477464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        return true;
1478464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    }
1479464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    return false;
1480464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton}
1481464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
1482464a5063bc59755cb6ec063d0b2491097302d2abGreg Claytonvoid
1483464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonSymbolFileDWARFDebugMap::FinalizeOSOFileRanges (CompileUnitInfo *cu_info)
1484464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{
1485464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    cu_info->file_range_map.Sort();
1486464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton#if defined(DEBUG_OSO_DMAP)
1487464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    const FileRangeMap &oso_file_range_map = cu_info->GetFileRangeMap(this);
1488464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    const size_t n = oso_file_range_map.GetSize();
148997a19b21dacd9063bb5475812df7781777262198Greg Clayton    printf ("SymbolFileDWARFDebugMap::FinalizeOSOFileRanges (cu_info = %p) %s\n",
1490a48b8eb95e4217e6ba0e6b3c0c3a909811766d4bGreg Clayton            cu_info,
149197a19b21dacd9063bb5475812df7781777262198Greg Clayton            cu_info->oso_sp->module_sp->GetFileSpec().GetPath().c_str());
1492464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    for (size_t i=0; i<n; ++i)
1493464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    {
1494464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        const FileRangeMap::Entry &entry = oso_file_range_map.GetEntryRef(i);
1495464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        printf ("oso [0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ") ==> exe [0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ")\n",
1496464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                entry.GetRangeBase(), entry.GetRangeEnd(),
1497464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                entry.data, entry.data + entry.GetByteSize());
1498464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    }
1499464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton#endif
1500464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton}
1501464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
1502464a5063bc59755cb6ec063d0b2491097302d2abGreg Claytonlldb::addr_t
1503464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonSymbolFileDWARFDebugMap::LinkOSOFileAddress (SymbolFileDWARF *oso_symfile, lldb::addr_t oso_file_addr)
1504464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{
1505464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    CompileUnitInfo *cu_info = GetCompileUnitInfo (oso_symfile);
1506464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    if (cu_info)
1507464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    {
1508464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        const FileRangeMap::Entry *oso_range_entry = cu_info->GetFileRangeMap(this).FindEntryThatContains(oso_file_addr);
1509464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        if (oso_range_entry)
1510464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        {
1511464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            const DebugMap::Entry *debug_map_entry = m_debug_map.FindEntryThatContains(oso_range_entry->data);
1512464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            if (debug_map_entry)
1513464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            {
1514464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                const lldb::addr_t offset = oso_file_addr - oso_range_entry->GetRangeBase();
1515464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                const lldb::addr_t exe_file_addr = debug_map_entry->GetRangeBase() + offset;
1516464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                return exe_file_addr;
1517464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            }
1518464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        }
1519464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    }
1520464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    return LLDB_INVALID_ADDRESS;
1521464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton}
1522464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
1523464a5063bc59755cb6ec063d0b2491097302d2abGreg Claytonbool
1524464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonSymbolFileDWARFDebugMap::LinkOSOAddress (Address &addr)
1525464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{
1526464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    // Make sure this address hasn't been fixed already
1527464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    Module *exe_module = GetObjectFile()->GetModule().get();
1528464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    Module *addr_module = addr.GetModule().get();
1529464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    if (addr_module == exe_module)
1530464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        return true; // Address is already in terms of the main executable module
1531464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
15320e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    CompileUnitInfo *cu_info = GetCompileUnitInfo (GetSymbolFileAsSymbolFileDWARF(addr_module->GetSymbolVendor()->GetSymbolFile()));
1533464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    if (cu_info)
1534464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    {
1535464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        const lldb::addr_t oso_file_addr = addr.GetFileAddress();
1536464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        const FileRangeMap::Entry *oso_range_entry = cu_info->GetFileRangeMap(this).FindEntryThatContains(oso_file_addr);
1537464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        if (oso_range_entry)
1538464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        {
1539464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            const DebugMap::Entry *debug_map_entry = m_debug_map.FindEntryThatContains(oso_range_entry->data);
1540464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            if (debug_map_entry)
1541464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            {
1542464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                const lldb::addr_t offset = oso_file_addr - oso_range_entry->GetRangeBase();
1543464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                const lldb::addr_t exe_file_addr = debug_map_entry->GetRangeBase() + offset;
1544464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton                return exe_module->ResolveFileAddress(exe_file_addr, addr);
1545464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton            }
1546464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        }
1547464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    }
1548464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    return true;
1549464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton}
1550464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
1551464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonLineTable *
1552464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonSymbolFileDWARFDebugMap::LinkOSOLineTable (SymbolFileDWARF *oso_dwarf, LineTable *line_table)
1553464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{
1554464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    CompileUnitInfo *cu_info = GetCompileUnitInfo (oso_dwarf);
1555464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    if (cu_info)
1556464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton        return line_table->LinkLineTable(cu_info->GetFileRangeMap(this));
1557464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton    return NULL;
1558464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton}
1559464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton
156000f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granatasize_t
156100f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico GranataSymbolFileDWARFDebugMap::AddOSOARanges (SymbolFileDWARF* dwarf2Data, DWARFDebugAranges* debug_aranges)
156200f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata{
156300f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata    size_t num_line_entries_added = 0;
156400f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata    if (debug_aranges && dwarf2Data)
156500f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata    {
156600f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata        CompileUnitInfo *compile_unit_info = GetCompileUnitInfo(dwarf2Data);
156700f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata        if (compile_unit_info)
156800f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata        {
156900f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata            const FileRangeMap &file_range_map = compile_unit_info->GetFileRangeMap(this);
157000f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata            for (size_t idx = 0;
157100f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                 idx < file_range_map.GetSize();
157200f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                 idx++)
157300f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata            {
157400f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                const FileRangeMap::Entry* entry = file_range_map.GetEntryAtIndex(idx);
157500f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                if (entry)
157600f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                {
157700f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                    printf ("[0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ")\n", entry->GetRangeBase(), entry->GetRangeEnd());
157800f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                    debug_aranges->AppendRange(dwarf2Data->GetID(), entry->GetRangeBase(), entry->GetRangeEnd());
157900f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                    num_line_entries_added++;
158000f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata                }
158100f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata            }
158200f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata        }
158300f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata    }
158400f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata    return num_line_entries_added;
158500f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata}
1586444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton
1587