SymbolFileDWARF.cpp revision 269024
1//===-- SymbolFileDWARF.cpp ------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "SymbolFileDWARF.h"
11
12// Other libraries and framework includes
13#include "clang/AST/ASTConsumer.h"
14#include "clang/AST/ASTContext.h"
15#include "clang/AST/Decl.h"
16#include "clang/AST/DeclGroup.h"
17#include "clang/AST/DeclObjC.h"
18#include "clang/AST/DeclTemplate.h"
19#include "clang/Basic/Builtins.h"
20#include "clang/Basic/IdentifierTable.h"
21#include "clang/Basic/LangOptions.h"
22#include "clang/Basic/SourceManager.h"
23#include "clang/Basic/TargetInfo.h"
24#include "clang/Basic/Specifiers.h"
25#include "clang/Sema/DeclSpec.h"
26
27#include "llvm/Support/Casting.h"
28
29#include "lldb/Core/Module.h"
30#include "lldb/Core/PluginManager.h"
31#include "lldb/Core/RegularExpression.h"
32#include "lldb/Core/Scalar.h"
33#include "lldb/Core/Section.h"
34#include "lldb/Core/StreamFile.h"
35#include "lldb/Core/StreamString.h"
36#include "lldb/Core/Timer.h"
37#include "lldb/Core/Value.h"
38
39#include "lldb/Host/Host.h"
40
41#include "lldb/Symbol/Block.h"
42#include "lldb/Symbol/ClangExternalASTSourceCallbacks.h"
43#include "lldb/Symbol/CompileUnit.h"
44#include "lldb/Symbol/LineTable.h"
45#include "lldb/Symbol/ObjectFile.h"
46#include "lldb/Symbol/SymbolVendor.h"
47#include "lldb/Symbol/VariableList.h"
48
49#include "lldb/Target/ObjCLanguageRuntime.h"
50#include "lldb/Target/CPPLanguageRuntime.h"
51
52#include "DWARFCompileUnit.h"
53#include "DWARFDebugAbbrev.h"
54#include "DWARFDebugAranges.h"
55#include "DWARFDebugInfo.h"
56#include "DWARFDebugInfoEntry.h"
57#include "DWARFDebugLine.h"
58#include "DWARFDebugPubnames.h"
59#include "DWARFDebugRanges.h"
60#include "DWARFDeclContext.h"
61#include "DWARFDIECollection.h"
62#include "DWARFFormValue.h"
63#include "DWARFLocationList.h"
64#include "LogChannelDWARF.h"
65#include "SymbolFileDWARFDebugMap.h"
66
67#include <map>
68
69//#define ENABLE_DEBUG_PRINTF // COMMENT OUT THIS LINE PRIOR TO CHECKIN
70
71#ifdef ENABLE_DEBUG_PRINTF
72#include <stdio.h>
73#define DEBUG_PRINTF(fmt, ...) printf(fmt, __VA_ARGS__)
74#else
75#define DEBUG_PRINTF(fmt, ...)
76#endif
77
78#define DIE_IS_BEING_PARSED ((lldb_private::Type*)1)
79
80using namespace lldb;
81using namespace lldb_private;
82
83//static inline bool
84//child_requires_parent_class_union_or_struct_to_be_completed (dw_tag_t tag)
85//{
86//    switch (tag)
87//    {
88//    default:
89//        break;
90//    case DW_TAG_subprogram:
91//    case DW_TAG_inlined_subroutine:
92//    case DW_TAG_class_type:
93//    case DW_TAG_structure_type:
94//    case DW_TAG_union_type:
95//        return true;
96//    }
97//    return false;
98//}
99//
100static AccessType
101DW_ACCESS_to_AccessType (uint32_t dwarf_accessibility)
102{
103    switch (dwarf_accessibility)
104    {
105        case DW_ACCESS_public:      return eAccessPublic;
106        case DW_ACCESS_private:     return eAccessPrivate;
107        case DW_ACCESS_protected:   return eAccessProtected;
108        default:                    break;
109    }
110    return eAccessNone;
111}
112
113#if defined(LLDB_CONFIGURATION_DEBUG) or defined(LLDB_CONFIGURATION_RELEASE)
114
115class DIEStack
116{
117public:
118
119    void Push (DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die)
120    {
121        m_dies.push_back (DIEInfo(cu, die));
122    }
123
124
125    void LogDIEs (Log *log, SymbolFileDWARF *dwarf)
126    {
127        StreamString log_strm;
128        const size_t n = m_dies.size();
129        log_strm.Printf("DIEStack[%" PRIu64 "]:\n", (uint64_t)n);
130        for (size_t i=0; i<n; i++)
131        {
132            DWARFCompileUnit *cu = m_dies[i].cu;
133            const DWARFDebugInfoEntry *die = m_dies[i].die;
134            std::string qualified_name;
135            die->GetQualifiedName(dwarf, cu, qualified_name);
136            log_strm.Printf ("[%" PRIu64 "] 0x%8.8x: %s name='%s'\n",
137                             (uint64_t)i,
138                             die->GetOffset(),
139                             DW_TAG_value_to_name(die->Tag()),
140                             qualified_name.c_str());
141        }
142        log->PutCString(log_strm.GetData());
143    }
144    void Pop ()
145    {
146        m_dies.pop_back();
147    }
148
149    class ScopedPopper
150    {
151    public:
152        ScopedPopper (DIEStack &die_stack) :
153            m_die_stack (die_stack),
154            m_valid (false)
155        {
156        }
157
158        void
159        Push (DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die)
160        {
161            m_valid = true;
162            m_die_stack.Push (cu, die);
163        }
164
165        ~ScopedPopper ()
166        {
167            if (m_valid)
168                m_die_stack.Pop();
169        }
170
171
172
173    protected:
174        DIEStack &m_die_stack;
175        bool m_valid;
176    };
177
178protected:
179    struct DIEInfo {
180        DIEInfo (DWARFCompileUnit *c, const DWARFDebugInfoEntry *d) :
181            cu(c),
182            die(d)
183        {
184        }
185        DWARFCompileUnit *cu;
186        const DWARFDebugInfoEntry *die;
187    };
188    typedef std::vector<DIEInfo> Stack;
189    Stack m_dies;
190};
191#endif
192
193void
194SymbolFileDWARF::Initialize()
195{
196    LogChannelDWARF::Initialize();
197    PluginManager::RegisterPlugin (GetPluginNameStatic(),
198                                   GetPluginDescriptionStatic(),
199                                   CreateInstance);
200}
201
202void
203SymbolFileDWARF::Terminate()
204{
205    PluginManager::UnregisterPlugin (CreateInstance);
206    LogChannelDWARF::Initialize();
207}
208
209
210lldb_private::ConstString
211SymbolFileDWARF::GetPluginNameStatic()
212{
213    static ConstString g_name("dwarf");
214    return g_name;
215}
216
217const char *
218SymbolFileDWARF::GetPluginDescriptionStatic()
219{
220    return "DWARF and DWARF3 debug symbol file reader.";
221}
222
223
224SymbolFile*
225SymbolFileDWARF::CreateInstance (ObjectFile* obj_file)
226{
227    return new SymbolFileDWARF(obj_file);
228}
229
230TypeList *
231SymbolFileDWARF::GetTypeList ()
232{
233    if (GetDebugMapSymfile ())
234        return m_debug_map_symfile->GetTypeList();
235    return m_obj_file->GetModule()->GetTypeList();
236
237}
238void
239SymbolFileDWARF::GetTypes (DWARFCompileUnit* cu,
240                           const DWARFDebugInfoEntry *die,
241                           dw_offset_t min_die_offset,
242                           dw_offset_t max_die_offset,
243                           uint32_t type_mask,
244                           TypeSet &type_set)
245{
246    if (cu)
247    {
248        if (die)
249        {
250            const dw_offset_t die_offset = die->GetOffset();
251
252            if (die_offset >= max_die_offset)
253                return;
254
255            if (die_offset >= min_die_offset)
256            {
257                const dw_tag_t tag = die->Tag();
258
259                bool add_type = false;
260
261                switch (tag)
262                {
263                    case DW_TAG_array_type:         add_type = (type_mask & eTypeClassArray         ) != 0; break;
264                    case DW_TAG_unspecified_type:
265                    case DW_TAG_base_type:          add_type = (type_mask & eTypeClassBuiltin       ) != 0; break;
266                    case DW_TAG_class_type:         add_type = (type_mask & eTypeClassClass         ) != 0; break;
267                    case DW_TAG_structure_type:     add_type = (type_mask & eTypeClassStruct        ) != 0; break;
268                    case DW_TAG_union_type:         add_type = (type_mask & eTypeClassUnion         ) != 0; break;
269                    case DW_TAG_enumeration_type:   add_type = (type_mask & eTypeClassEnumeration   ) != 0; break;
270                    case DW_TAG_subroutine_type:
271                    case DW_TAG_subprogram:
272                    case DW_TAG_inlined_subroutine: add_type = (type_mask & eTypeClassFunction      ) != 0; break;
273                    case DW_TAG_pointer_type:       add_type = (type_mask & eTypeClassPointer       ) != 0; break;
274                    case DW_TAG_rvalue_reference_type:
275                    case DW_TAG_reference_type:     add_type = (type_mask & eTypeClassReference     ) != 0; break;
276                    case DW_TAG_typedef:            add_type = (type_mask & eTypeClassTypedef       ) != 0; break;
277                    case DW_TAG_ptr_to_member_type: add_type = (type_mask & eTypeClassMemberPointer ) != 0; break;
278                }
279
280                if (add_type)
281                {
282                    const bool assert_not_being_parsed = true;
283                    Type *type = ResolveTypeUID (cu, die, assert_not_being_parsed);
284                    if (type)
285                    {
286                        if (type_set.find(type) == type_set.end())
287                            type_set.insert(type);
288                    }
289                }
290            }
291
292            for (const DWARFDebugInfoEntry *child_die = die->GetFirstChild();
293                 child_die != NULL;
294                 child_die = child_die->GetSibling())
295            {
296                GetTypes (cu, child_die, min_die_offset, max_die_offset, type_mask, type_set);
297            }
298        }
299    }
300}
301
302size_t
303SymbolFileDWARF::GetTypes (SymbolContextScope *sc_scope,
304                           uint32_t type_mask,
305                           TypeList &type_list)
306
307{
308    TypeSet type_set;
309
310    CompileUnit *comp_unit = NULL;
311    DWARFCompileUnit* dwarf_cu = NULL;
312    if (sc_scope)
313        comp_unit = sc_scope->CalculateSymbolContextCompileUnit();
314
315    if (comp_unit)
316    {
317        dwarf_cu = GetDWARFCompileUnit(comp_unit);
318        if (dwarf_cu == 0)
319            return 0;
320        GetTypes (dwarf_cu,
321                  dwarf_cu->DIE(),
322                  dwarf_cu->GetOffset(),
323                  dwarf_cu->GetNextCompileUnitOffset(),
324                  type_mask,
325                  type_set);
326    }
327    else
328    {
329        DWARFDebugInfo* info = DebugInfo();
330        if (info)
331        {
332            const size_t num_cus = info->GetNumCompileUnits();
333            for (size_t cu_idx=0; cu_idx<num_cus; ++cu_idx)
334            {
335                dwarf_cu = info->GetCompileUnitAtIndex(cu_idx);
336                if (dwarf_cu)
337                {
338                    GetTypes (dwarf_cu,
339                              dwarf_cu->DIE(),
340                              0,
341                              UINT32_MAX,
342                              type_mask,
343                              type_set);
344                }
345            }
346        }
347    }
348//    if (m_using_apple_tables)
349//    {
350//        DWARFMappedHash::MemoryTable *apple_types = m_apple_types_ap.get();
351//        if (apple_types)
352//        {
353//            apple_types->ForEach([this, &type_set, apple_types, type_mask](const DWARFMappedHash::DIEInfoArray &die_info_array) -> bool {
354//
355//                for (auto die_info: die_info_array)
356//                {
357//                    bool add_type = TagMatchesTypeMask (type_mask, 0);
358//                    if (!add_type)
359//                    {
360//                        dw_tag_t tag = die_info.tag;
361//                        if (tag == 0)
362//                        {
363//                            const DWARFDebugInfoEntry *die = DebugInfo()->GetDIEPtr(die_info.offset, NULL);
364//                            tag = die->Tag();
365//                        }
366//                        add_type = TagMatchesTypeMask (type_mask, tag);
367//                    }
368//                    if (add_type)
369//                    {
370//                        Type *type = ResolveTypeUID(die_info.offset);
371//
372//                        if (type_set.find(type) == type_set.end())
373//                            type_set.insert(type);
374//                    }
375//                }
376//                return true; // Keep iterating
377//            });
378//        }
379//    }
380//    else
381//    {
382//        if (!m_indexed)
383//            Index ();
384//
385//        m_type_index.ForEach([this, &type_set, type_mask](const char *name, uint32_t die_offset) -> bool {
386//
387//            bool add_type = TagMatchesTypeMask (type_mask, 0);
388//
389//            if (!add_type)
390//            {
391//                const DWARFDebugInfoEntry *die = DebugInfo()->GetDIEPtr(die_offset, NULL);
392//                if (die)
393//                {
394//                    const dw_tag_t tag = die->Tag();
395//                    add_type = TagMatchesTypeMask (type_mask, tag);
396//                }
397//            }
398//
399//            if (add_type)
400//            {
401//                Type *type = ResolveTypeUID(die_offset);
402//
403//                if (type_set.find(type) == type_set.end())
404//                    type_set.insert(type);
405//            }
406//            return true; // Keep iterating
407//        });
408//    }
409
410    std::set<ClangASTType> clang_type_set;
411    size_t num_types_added = 0;
412    for (Type *type : type_set)
413    {
414        ClangASTType clang_type = type->GetClangForwardType();
415        if (clang_type_set.find(clang_type) == clang_type_set.end())
416        {
417            clang_type_set.insert(clang_type);
418            type_list.Insert (type->shared_from_this());
419            ++num_types_added;
420        }
421    }
422    return num_types_added;
423}
424
425
426//----------------------------------------------------------------------
427// Gets the first parent that is a lexical block, function or inlined
428// subroutine, or compile unit.
429//----------------------------------------------------------------------
430static const DWARFDebugInfoEntry *
431GetParentSymbolContextDIE(const DWARFDebugInfoEntry *child_die)
432{
433    const DWARFDebugInfoEntry *die;
434    for (die = child_die->GetParent(); die != NULL; die = die->GetParent())
435    {
436        dw_tag_t tag = die->Tag();
437
438        switch (tag)
439        {
440        case DW_TAG_compile_unit:
441        case DW_TAG_subprogram:
442        case DW_TAG_inlined_subroutine:
443        case DW_TAG_lexical_block:
444            return die;
445        }
446    }
447    return NULL;
448}
449
450
451SymbolFileDWARF::SymbolFileDWARF(ObjectFile* objfile) :
452    SymbolFile (objfile),
453    UserID (0),  // Used by SymbolFileDWARFDebugMap to when this class parses .o files to contain the .o file index/ID
454    m_debug_map_module_wp (),
455    m_debug_map_symfile (NULL),
456    m_clang_tu_decl (NULL),
457    m_flags(),
458    m_data_debug_abbrev (),
459    m_data_debug_aranges (),
460    m_data_debug_frame (),
461    m_data_debug_info (),
462    m_data_debug_line (),
463    m_data_debug_loc (),
464    m_data_debug_ranges (),
465    m_data_debug_str (),
466    m_data_apple_names (),
467    m_data_apple_types (),
468    m_data_apple_namespaces (),
469    m_abbr(),
470    m_info(),
471    m_line(),
472    m_apple_names_ap (),
473    m_apple_types_ap (),
474    m_apple_namespaces_ap (),
475    m_apple_objc_ap (),
476    m_function_basename_index(),
477    m_function_fullname_index(),
478    m_function_method_index(),
479    m_function_selector_index(),
480    m_objc_class_selectors_index(),
481    m_global_index(),
482    m_type_index(),
483    m_namespace_index(),
484    m_indexed (false),
485    m_is_external_ast_source (false),
486    m_using_apple_tables (false),
487    m_supports_DW_AT_APPLE_objc_complete_type (eLazyBoolCalculate),
488    m_ranges(),
489    m_unique_ast_type_map ()
490{
491}
492
493SymbolFileDWARF::~SymbolFileDWARF()
494{
495    if (m_is_external_ast_source)
496    {
497        ModuleSP module_sp (m_obj_file->GetModule());
498        if (module_sp)
499            module_sp->GetClangASTContext().RemoveExternalSource ();
500    }
501}
502
503static const ConstString &
504GetDWARFMachOSegmentName ()
505{
506    static ConstString g_dwarf_section_name ("__DWARF");
507    return g_dwarf_section_name;
508}
509
510UniqueDWARFASTTypeMap &
511SymbolFileDWARF::GetUniqueDWARFASTTypeMap ()
512{
513    if (GetDebugMapSymfile ())
514        return m_debug_map_symfile->GetUniqueDWARFASTTypeMap ();
515    return m_unique_ast_type_map;
516}
517
518ClangASTContext &
519SymbolFileDWARF::GetClangASTContext ()
520{
521    if (GetDebugMapSymfile ())
522        return m_debug_map_symfile->GetClangASTContext ();
523
524    ClangASTContext &ast = m_obj_file->GetModule()->GetClangASTContext();
525    if (!m_is_external_ast_source)
526    {
527        m_is_external_ast_source = true;
528        llvm::OwningPtr<clang::ExternalASTSource> ast_source_ap (
529            new ClangExternalASTSourceCallbacks (SymbolFileDWARF::CompleteTagDecl,
530                                                 SymbolFileDWARF::CompleteObjCInterfaceDecl,
531                                                 SymbolFileDWARF::FindExternalVisibleDeclsByName,
532                                                 SymbolFileDWARF::LayoutRecordType,
533                                                 this));
534        ast.SetExternalSource (ast_source_ap);
535    }
536    return ast;
537}
538
539void
540SymbolFileDWARF::InitializeObject()
541{
542    // Install our external AST source callbacks so we can complete Clang types.
543    ModuleSP module_sp (m_obj_file->GetModule());
544    if (module_sp)
545    {
546        const SectionList *section_list = module_sp->GetSectionList();
547
548        const Section* section = section_list->FindSectionByName(GetDWARFMachOSegmentName ()).get();
549
550        // Memory map the DWARF mach-o segment so we have everything mmap'ed
551        // to keep our heap memory usage down.
552        if (section)
553            m_obj_file->MemoryMapSectionData(section, m_dwarf_data);
554    }
555    get_apple_names_data();
556    if (m_data_apple_names.GetByteSize() > 0)
557    {
558        m_apple_names_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_names, get_debug_str_data(), ".apple_names"));
559        if (m_apple_names_ap->IsValid())
560            m_using_apple_tables = true;
561        else
562            m_apple_names_ap.reset();
563    }
564    get_apple_types_data();
565    if (m_data_apple_types.GetByteSize() > 0)
566    {
567        m_apple_types_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_types, get_debug_str_data(), ".apple_types"));
568        if (m_apple_types_ap->IsValid())
569            m_using_apple_tables = true;
570        else
571            m_apple_types_ap.reset();
572    }
573
574    get_apple_namespaces_data();
575    if (m_data_apple_namespaces.GetByteSize() > 0)
576    {
577        m_apple_namespaces_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_namespaces, get_debug_str_data(), ".apple_namespaces"));
578        if (m_apple_namespaces_ap->IsValid())
579            m_using_apple_tables = true;
580        else
581            m_apple_namespaces_ap.reset();
582    }
583
584    get_apple_objc_data();
585    if (m_data_apple_objc.GetByteSize() > 0)
586    {
587        m_apple_objc_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_objc, get_debug_str_data(), ".apple_objc"));
588        if (m_apple_objc_ap->IsValid())
589            m_using_apple_tables = true;
590        else
591            m_apple_objc_ap.reset();
592    }
593}
594
595bool
596SymbolFileDWARF::SupportedVersion(uint16_t version)
597{
598    return version == 2 || version == 3 || version == 4;
599}
600
601uint32_t
602SymbolFileDWARF::CalculateAbilities ()
603{
604    uint32_t abilities = 0;
605    if (m_obj_file != NULL)
606    {
607        const Section* section = NULL;
608        const SectionList *section_list = m_obj_file->GetSectionList();
609        if (section_list == NULL)
610            return 0;
611
612        uint64_t debug_abbrev_file_size = 0;
613        uint64_t debug_info_file_size = 0;
614        uint64_t debug_line_file_size = 0;
615
616        section = section_list->FindSectionByName(GetDWARFMachOSegmentName ()).get();
617
618        if (section)
619            section_list = &section->GetChildren ();
620
621        section = section_list->FindSectionByType (eSectionTypeDWARFDebugInfo, true).get();
622        if (section != NULL)
623        {
624            debug_info_file_size = section->GetFileSize();
625
626            section = section_list->FindSectionByType (eSectionTypeDWARFDebugAbbrev, true).get();
627            if (section)
628                debug_abbrev_file_size = section->GetFileSize();
629            else
630                m_flags.Set (flagsGotDebugAbbrevData);
631
632            section = section_list->FindSectionByType (eSectionTypeDWARFDebugAranges, true).get();
633            if (!section)
634                m_flags.Set (flagsGotDebugArangesData);
635
636            section = section_list->FindSectionByType (eSectionTypeDWARFDebugFrame, true).get();
637            if (!section)
638                m_flags.Set (flagsGotDebugFrameData);
639
640            section = section_list->FindSectionByType (eSectionTypeDWARFDebugLine, true).get();
641            if (section)
642                debug_line_file_size = section->GetFileSize();
643            else
644                m_flags.Set (flagsGotDebugLineData);
645
646            section = section_list->FindSectionByType (eSectionTypeDWARFDebugLoc, true).get();
647            if (!section)
648                m_flags.Set (flagsGotDebugLocData);
649
650            section = section_list->FindSectionByType (eSectionTypeDWARFDebugMacInfo, true).get();
651            if (!section)
652                m_flags.Set (flagsGotDebugMacInfoData);
653
654            section = section_list->FindSectionByType (eSectionTypeDWARFDebugPubNames, true).get();
655            if (!section)
656                m_flags.Set (flagsGotDebugPubNamesData);
657
658            section = section_list->FindSectionByType (eSectionTypeDWARFDebugPubTypes, true).get();
659            if (!section)
660                m_flags.Set (flagsGotDebugPubTypesData);
661
662            section = section_list->FindSectionByType (eSectionTypeDWARFDebugRanges, true).get();
663            if (!section)
664                m_flags.Set (flagsGotDebugRangesData);
665
666            section = section_list->FindSectionByType (eSectionTypeDWARFDebugStr, true).get();
667            if (!section)
668                m_flags.Set (flagsGotDebugStrData);
669        }
670        else
671        {
672            const char *symfile_dir_cstr = m_obj_file->GetFileSpec().GetDirectory().GetCString();
673            if (symfile_dir_cstr)
674            {
675                if (strcasestr(symfile_dir_cstr, ".dsym"))
676                {
677                    if (m_obj_file->GetType() == ObjectFile::eTypeDebugInfo)
678                    {
679                        // We have a dSYM file that didn't have a any debug info.
680                        // If the string table has a size of 1, then it was made from
681                        // an executable with no debug info, or from an executable that
682                        // was stripped.
683                        section = section_list->FindSectionByType (eSectionTypeDWARFDebugStr, true).get();
684                        if (section && section->GetFileSize() == 1)
685                        {
686                            m_obj_file->GetModule()->ReportWarning ("empty dSYM file detected, dSYM was created with an executable with no debug info.");
687                        }
688                    }
689                }
690            }
691        }
692
693        if (debug_abbrev_file_size > 0 && debug_info_file_size > 0)
694            abilities |= CompileUnits | Functions | Blocks | GlobalVariables | LocalVariables | VariableTypes;
695
696        if (debug_line_file_size > 0)
697            abilities |= LineTables;
698    }
699    return abilities;
700}
701
702const DWARFDataExtractor&
703SymbolFileDWARF::GetCachedSectionData (uint32_t got_flag, SectionType sect_type, DWARFDataExtractor &data)
704{
705    if (m_flags.IsClear (got_flag))
706    {
707        ModuleSP module_sp (m_obj_file->GetModule());
708        m_flags.Set (got_flag);
709        const SectionList *section_list = module_sp->GetSectionList();
710        if (section_list)
711        {
712            SectionSP section_sp (section_list->FindSectionByType(sect_type, true));
713            if (section_sp)
714            {
715                // See if we memory mapped the DWARF segment?
716                if (m_dwarf_data.GetByteSize())
717                {
718                    data.SetData(m_dwarf_data, section_sp->GetOffset (), section_sp->GetFileSize());
719                }
720                else
721                {
722                    if (m_obj_file->ReadSectionData (section_sp.get(), data) == 0)
723                        data.Clear();
724                }
725            }
726        }
727    }
728    return data;
729}
730
731const DWARFDataExtractor&
732SymbolFileDWARF::get_debug_abbrev_data()
733{
734    return GetCachedSectionData (flagsGotDebugAbbrevData, eSectionTypeDWARFDebugAbbrev, m_data_debug_abbrev);
735}
736
737const DWARFDataExtractor&
738SymbolFileDWARF::get_debug_aranges_data()
739{
740    return GetCachedSectionData (flagsGotDebugArangesData, eSectionTypeDWARFDebugAranges, m_data_debug_aranges);
741}
742
743const DWARFDataExtractor&
744SymbolFileDWARF::get_debug_frame_data()
745{
746    return GetCachedSectionData (flagsGotDebugFrameData, eSectionTypeDWARFDebugFrame, m_data_debug_frame);
747}
748
749const DWARFDataExtractor&
750SymbolFileDWARF::get_debug_info_data()
751{
752    return GetCachedSectionData (flagsGotDebugInfoData, eSectionTypeDWARFDebugInfo, m_data_debug_info);
753}
754
755const DWARFDataExtractor&
756SymbolFileDWARF::get_debug_line_data()
757{
758    return GetCachedSectionData (flagsGotDebugLineData, eSectionTypeDWARFDebugLine, m_data_debug_line);
759}
760
761const DWARFDataExtractor&
762SymbolFileDWARF::get_debug_loc_data()
763{
764    return GetCachedSectionData (flagsGotDebugLocData, eSectionTypeDWARFDebugLoc, m_data_debug_loc);
765}
766
767const DWARFDataExtractor&
768SymbolFileDWARF::get_debug_ranges_data()
769{
770    return GetCachedSectionData (flagsGotDebugRangesData, eSectionTypeDWARFDebugRanges, m_data_debug_ranges);
771}
772
773const DWARFDataExtractor&
774SymbolFileDWARF::get_debug_str_data()
775{
776    return GetCachedSectionData (flagsGotDebugStrData, eSectionTypeDWARFDebugStr, m_data_debug_str);
777}
778
779const DWARFDataExtractor&
780SymbolFileDWARF::get_apple_names_data()
781{
782    return GetCachedSectionData (flagsGotAppleNamesData, eSectionTypeDWARFAppleNames, m_data_apple_names);
783}
784
785const DWARFDataExtractor&
786SymbolFileDWARF::get_apple_types_data()
787{
788    return GetCachedSectionData (flagsGotAppleTypesData, eSectionTypeDWARFAppleTypes, m_data_apple_types);
789}
790
791const DWARFDataExtractor&
792SymbolFileDWARF::get_apple_namespaces_data()
793{
794    return GetCachedSectionData (flagsGotAppleNamespacesData, eSectionTypeDWARFAppleNamespaces, m_data_apple_namespaces);
795}
796
797const DWARFDataExtractor&
798SymbolFileDWARF::get_apple_objc_data()
799{
800    return GetCachedSectionData (flagsGotAppleObjCData, eSectionTypeDWARFAppleObjC, m_data_apple_objc);
801}
802
803
804DWARFDebugAbbrev*
805SymbolFileDWARF::DebugAbbrev()
806{
807    if (m_abbr.get() == NULL)
808    {
809        const DWARFDataExtractor &debug_abbrev_data = get_debug_abbrev_data();
810        if (debug_abbrev_data.GetByteSize() > 0)
811        {
812            m_abbr.reset(new DWARFDebugAbbrev());
813            if (m_abbr.get())
814                m_abbr->Parse(debug_abbrev_data);
815        }
816    }
817    return m_abbr.get();
818}
819
820const DWARFDebugAbbrev*
821SymbolFileDWARF::DebugAbbrev() const
822{
823    return m_abbr.get();
824}
825
826
827DWARFDebugInfo*
828SymbolFileDWARF::DebugInfo()
829{
830    if (m_info.get() == NULL)
831    {
832        Timer scoped_timer(__PRETTY_FUNCTION__, "%s this = %p", __PRETTY_FUNCTION__, this);
833        if (get_debug_info_data().GetByteSize() > 0)
834        {
835            m_info.reset(new DWARFDebugInfo());
836            if (m_info.get())
837            {
838                m_info->SetDwarfData(this);
839            }
840        }
841    }
842    return m_info.get();
843}
844
845const DWARFDebugInfo*
846SymbolFileDWARF::DebugInfo() const
847{
848    return m_info.get();
849}
850
851DWARFCompileUnit*
852SymbolFileDWARF::GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit)
853{
854    DWARFDebugInfo* info = DebugInfo();
855    if (info)
856    {
857        if (GetDebugMapSymfile ())
858        {
859            // The debug map symbol file made the compile units for this DWARF
860            // file which is .o file with DWARF in it, and we should have
861            // only 1 compile unit which is at offset zero in the DWARF.
862            // TODO: modify to support LTO .o files where each .o file might
863            // have multiple DW_TAG_compile_unit tags.
864            return info->GetCompileUnit(0).get();
865        }
866        else
867        {
868            // Just a normal DWARF file whose user ID for the compile unit is
869            // the DWARF offset itself
870            return info->GetCompileUnit((dw_offset_t)comp_unit->GetID()).get();
871        }
872    }
873    return NULL;
874}
875
876
877DWARFDebugRanges*
878SymbolFileDWARF::DebugRanges()
879{
880    if (m_ranges.get() == NULL)
881    {
882        Timer scoped_timer(__PRETTY_FUNCTION__, "%s this = %p", __PRETTY_FUNCTION__, this);
883        if (get_debug_ranges_data().GetByteSize() > 0)
884        {
885            m_ranges.reset(new DWARFDebugRanges());
886            if (m_ranges.get())
887                m_ranges->Extract(this);
888        }
889    }
890    return m_ranges.get();
891}
892
893const DWARFDebugRanges*
894SymbolFileDWARF::DebugRanges() const
895{
896    return m_ranges.get();
897}
898
899lldb::CompUnitSP
900SymbolFileDWARF::ParseCompileUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx)
901{
902    CompUnitSP cu_sp;
903    if (dwarf_cu)
904    {
905        CompileUnit *comp_unit = (CompileUnit*)dwarf_cu->GetUserData();
906        if (comp_unit)
907        {
908            // We already parsed this compile unit, had out a shared pointer to it
909            cu_sp = comp_unit->shared_from_this();
910        }
911        else
912        {
913            if (GetDebugMapSymfile ())
914            {
915                // Let the debug map create the compile unit
916                cu_sp = m_debug_map_symfile->GetCompileUnit(this);
917                dwarf_cu->SetUserData(cu_sp.get());
918            }
919            else
920            {
921                ModuleSP module_sp (m_obj_file->GetModule());
922                if (module_sp)
923                {
924                    const DWARFDebugInfoEntry * cu_die = dwarf_cu->GetCompileUnitDIEOnly ();
925                    if (cu_die)
926                    {
927                        const char * cu_die_name = cu_die->GetName(this, dwarf_cu);
928                        const char * cu_comp_dir = cu_die->GetAttributeValueAsString(this, dwarf_cu, DW_AT_comp_dir, NULL);
929                        LanguageType cu_language = (LanguageType)cu_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_language, 0);
930                        if (cu_die_name)
931                        {
932                            std::string ramapped_file;
933                            FileSpec cu_file_spec;
934
935                            if (cu_die_name[0] == '/' || cu_comp_dir == NULL || cu_comp_dir[0] == '\0')
936                            {
937                                // If we have a full path to the compile unit, we don't need to resolve
938                                // the file.  This can be expensive e.g. when the source files are NFS mounted.
939                                if (module_sp->RemapSourceFile(cu_die_name, ramapped_file))
940                                    cu_file_spec.SetFile (ramapped_file.c_str(), false);
941                                else
942                                    cu_file_spec.SetFile (cu_die_name, false);
943                            }
944                            else
945                            {
946                                std::string fullpath(cu_comp_dir);
947                                if (*fullpath.rbegin() != '/')
948                                    fullpath += '/';
949                                fullpath += cu_die_name;
950                                if (module_sp->RemapSourceFile (fullpath.c_str(), ramapped_file))
951                                    cu_file_spec.SetFile (ramapped_file.c_str(), false);
952                                else
953                                    cu_file_spec.SetFile (fullpath.c_str(), false);
954                            }
955
956                            cu_sp.reset(new CompileUnit (module_sp,
957                                                         dwarf_cu,
958                                                         cu_file_spec,
959                                                         MakeUserID(dwarf_cu->GetOffset()),
960                                                         cu_language));
961                            if (cu_sp)
962                            {
963                                dwarf_cu->SetUserData(cu_sp.get());
964
965                                // Figure out the compile unit index if we weren't given one
966                                if (cu_idx == UINT32_MAX)
967                                    DebugInfo()->GetCompileUnit(dwarf_cu->GetOffset(), &cu_idx);
968
969                                m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(cu_idx, cu_sp);
970                            }
971                        }
972                    }
973                }
974            }
975        }
976    }
977    return cu_sp;
978}
979
980uint32_t
981SymbolFileDWARF::GetNumCompileUnits()
982{
983    DWARFDebugInfo* info = DebugInfo();
984    if (info)
985        return info->GetNumCompileUnits();
986    return 0;
987}
988
989CompUnitSP
990SymbolFileDWARF::ParseCompileUnitAtIndex(uint32_t cu_idx)
991{
992    CompUnitSP cu_sp;
993    DWARFDebugInfo* info = DebugInfo();
994    if (info)
995    {
996        DWARFCompileUnit* dwarf_cu = info->GetCompileUnitAtIndex(cu_idx);
997        if (dwarf_cu)
998            cu_sp = ParseCompileUnit(dwarf_cu, cu_idx);
999    }
1000    return cu_sp;
1001}
1002
1003static void
1004AddRangesToBlock (Block& block,
1005                  DWARFDebugRanges::RangeList& ranges,
1006                  addr_t block_base_addr)
1007{
1008    const size_t num_ranges = ranges.GetSize();
1009    for (size_t i = 0; i<num_ranges; ++i)
1010    {
1011        const DWARFDebugRanges::Range &range = ranges.GetEntryRef (i);
1012        const addr_t range_base = range.GetRangeBase();
1013        assert (range_base >= block_base_addr);
1014        block.AddRange(Block::Range (range_base - block_base_addr, range.GetByteSize()));;
1015    }
1016    block.FinalizeRanges ();
1017}
1018
1019
1020Function *
1021SymbolFileDWARF::ParseCompileUnitFunction (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die)
1022{
1023    DWARFDebugRanges::RangeList func_ranges;
1024    const char *name = NULL;
1025    const char *mangled = NULL;
1026    int decl_file = 0;
1027    int decl_line = 0;
1028    int decl_column = 0;
1029    int call_file = 0;
1030    int call_line = 0;
1031    int call_column = 0;
1032    DWARFExpression frame_base;
1033
1034    assert (die->Tag() == DW_TAG_subprogram);
1035
1036    if (die->Tag() != DW_TAG_subprogram)
1037        return NULL;
1038
1039    if (die->GetDIENamesAndRanges (this,
1040                                   dwarf_cu,
1041                                   name,
1042                                   mangled,
1043                                   func_ranges,
1044                                   decl_file,
1045                                   decl_line,
1046                                   decl_column,
1047                                   call_file,
1048                                   call_line,
1049                                   call_column,
1050                                   &frame_base))
1051    {
1052        // Union of all ranges in the function DIE (if the function is discontiguous)
1053        AddressRange func_range;
1054        lldb::addr_t lowest_func_addr = func_ranges.GetMinRangeBase (0);
1055        lldb::addr_t highest_func_addr = func_ranges.GetMaxRangeEnd (0);
1056        if (lowest_func_addr != LLDB_INVALID_ADDRESS && lowest_func_addr <= highest_func_addr)
1057        {
1058            ModuleSP module_sp (m_obj_file->GetModule());
1059            func_range.GetBaseAddress().ResolveAddressUsingFileSections (lowest_func_addr, module_sp->GetSectionList());
1060            if (func_range.GetBaseAddress().IsValid())
1061                func_range.SetByteSize(highest_func_addr - lowest_func_addr);
1062        }
1063
1064        if (func_range.GetBaseAddress().IsValid())
1065        {
1066            Mangled func_name;
1067            if (mangled)
1068                func_name.SetValue(ConstString(mangled), true);
1069            else if (name)
1070                func_name.SetValue(ConstString(name), false);
1071
1072            FunctionSP func_sp;
1073            std::unique_ptr<Declaration> decl_ap;
1074            if (decl_file != 0 || decl_line != 0 || decl_column != 0)
1075                decl_ap.reset(new Declaration (sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file),
1076                                               decl_line,
1077                                               decl_column));
1078
1079            // Supply the type _only_ if it has already been parsed
1080            Type *func_type = m_die_to_type.lookup (die);
1081
1082            assert(func_type == NULL || func_type != DIE_IS_BEING_PARSED);
1083
1084            if (FixupAddress (func_range.GetBaseAddress()))
1085            {
1086                const user_id_t func_user_id = MakeUserID(die->GetOffset());
1087                func_sp.reset(new Function (sc.comp_unit,
1088                                            MakeUserID(func_user_id),       // UserID is the DIE offset
1089                                            MakeUserID(func_user_id),
1090                                            func_name,
1091                                            func_type,
1092                                            func_range));           // first address range
1093
1094                if (func_sp.get() != NULL)
1095                {
1096                    if (frame_base.IsValid())
1097                        func_sp->GetFrameBaseExpression() = frame_base;
1098                    sc.comp_unit->AddFunction(func_sp);
1099                    return func_sp.get();
1100                }
1101            }
1102        }
1103    }
1104    return NULL;
1105}
1106
1107bool
1108SymbolFileDWARF::FixupAddress (Address &addr)
1109{
1110    SymbolFileDWARFDebugMap * debug_map_symfile = GetDebugMapSymfile ();
1111    if (debug_map_symfile)
1112    {
1113        return debug_map_symfile->LinkOSOAddress(addr);
1114    }
1115    // This is a normal DWARF file, no address fixups need to happen
1116    return true;
1117}
1118lldb::LanguageType
1119SymbolFileDWARF::ParseCompileUnitLanguage (const SymbolContext& sc)
1120{
1121    assert (sc.comp_unit);
1122    DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
1123    if (dwarf_cu)
1124    {
1125        const DWARFDebugInfoEntry *die = dwarf_cu->GetCompileUnitDIEOnly();
1126        if (die)
1127        {
1128            const uint32_t language = die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_language, 0);
1129            if (language)
1130                return (lldb::LanguageType)language;
1131        }
1132    }
1133    return eLanguageTypeUnknown;
1134}
1135
1136size_t
1137SymbolFileDWARF::ParseCompileUnitFunctions(const SymbolContext &sc)
1138{
1139    assert (sc.comp_unit);
1140    size_t functions_added = 0;
1141    DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
1142    if (dwarf_cu)
1143    {
1144        DWARFDIECollection function_dies;
1145        const size_t num_functions = dwarf_cu->AppendDIEsWithTag (DW_TAG_subprogram, function_dies);
1146        size_t func_idx;
1147        for (func_idx = 0; func_idx < num_functions; ++func_idx)
1148        {
1149            const DWARFDebugInfoEntry *die = function_dies.GetDIEPtrAtIndex(func_idx);
1150            if (sc.comp_unit->FindFunctionByUID (MakeUserID(die->GetOffset())).get() == NULL)
1151            {
1152                if (ParseCompileUnitFunction(sc, dwarf_cu, die))
1153                    ++functions_added;
1154            }
1155        }
1156        //FixupTypes();
1157    }
1158    return functions_added;
1159}
1160
1161bool
1162SymbolFileDWARF::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList& support_files)
1163{
1164    assert (sc.comp_unit);
1165    DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
1166    if (dwarf_cu)
1167    {
1168        const DWARFDebugInfoEntry * cu_die = dwarf_cu->GetCompileUnitDIEOnly();
1169
1170        if (cu_die)
1171        {
1172            const char * cu_comp_dir = cu_die->GetAttributeValueAsString(this, dwarf_cu, DW_AT_comp_dir, NULL);
1173            dw_offset_t stmt_list = cu_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_stmt_list, DW_INVALID_OFFSET);
1174
1175            // All file indexes in DWARF are one based and a file of index zero is
1176            // supposed to be the compile unit itself.
1177            support_files.Append (*sc.comp_unit);
1178
1179            return DWARFDebugLine::ParseSupportFiles(sc.comp_unit->GetModule(), get_debug_line_data(), cu_comp_dir, stmt_list, support_files);
1180        }
1181    }
1182    return false;
1183}
1184
1185struct ParseDWARFLineTableCallbackInfo
1186{
1187    LineTable* line_table;
1188    std::unique_ptr<LineSequence> sequence_ap;
1189};
1190
1191//----------------------------------------------------------------------
1192// ParseStatementTableCallback
1193//----------------------------------------------------------------------
1194static void
1195ParseDWARFLineTableCallback(dw_offset_t offset, const DWARFDebugLine::State& state, void* userData)
1196{
1197    if (state.row == DWARFDebugLine::State::StartParsingLineTable)
1198    {
1199        // Just started parsing the line table
1200    }
1201    else if (state.row == DWARFDebugLine::State::DoneParsingLineTable)
1202    {
1203        // Done parsing line table, nothing to do for the cleanup
1204    }
1205    else
1206    {
1207        ParseDWARFLineTableCallbackInfo* info = (ParseDWARFLineTableCallbackInfo*)userData;
1208        LineTable* line_table = info->line_table;
1209
1210        // If this is our first time here, we need to create a
1211        // sequence container.
1212        if (!info->sequence_ap.get())
1213        {
1214            info->sequence_ap.reset(line_table->CreateLineSequenceContainer());
1215            assert(info->sequence_ap.get());
1216        }
1217        line_table->AppendLineEntryToSequence (info->sequence_ap.get(),
1218                                               state.address,
1219                                               state.line,
1220                                               state.column,
1221                                               state.file,
1222                                               state.is_stmt,
1223                                               state.basic_block,
1224                                               state.prologue_end,
1225                                               state.epilogue_begin,
1226                                               state.end_sequence);
1227        if (state.end_sequence)
1228        {
1229            // First, put the current sequence into the line table.
1230            line_table->InsertSequence(info->sequence_ap.get());
1231            // Then, empty it to prepare for the next sequence.
1232            info->sequence_ap->Clear();
1233        }
1234    }
1235}
1236
1237bool
1238SymbolFileDWARF::ParseCompileUnitLineTable (const SymbolContext &sc)
1239{
1240    assert (sc.comp_unit);
1241    if (sc.comp_unit->GetLineTable() != NULL)
1242        return true;
1243
1244    DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
1245    if (dwarf_cu)
1246    {
1247        const DWARFDebugInfoEntry *dwarf_cu_die = dwarf_cu->GetCompileUnitDIEOnly();
1248        if (dwarf_cu_die)
1249        {
1250            const dw_offset_t cu_line_offset = dwarf_cu_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_stmt_list, DW_INVALID_OFFSET);
1251            if (cu_line_offset != DW_INVALID_OFFSET)
1252            {
1253                std::unique_ptr<LineTable> line_table_ap(new LineTable(sc.comp_unit));
1254                if (line_table_ap.get())
1255                {
1256                    ParseDWARFLineTableCallbackInfo info;
1257                    info.line_table = line_table_ap.get();
1258                    lldb::offset_t offset = cu_line_offset;
1259                    DWARFDebugLine::ParseStatementTable(get_debug_line_data(), &offset, ParseDWARFLineTableCallback, &info);
1260                    if (m_debug_map_symfile)
1261                    {
1262                        // We have an object file that has a line table with addresses
1263                        // that are not linked. We need to link the line table and convert
1264                        // the addresses that are relative to the .o file into addresses
1265                        // for the main executable.
1266                        sc.comp_unit->SetLineTable (m_debug_map_symfile->LinkOSOLineTable (this, line_table_ap.get()));
1267                    }
1268                    else
1269                    {
1270                        sc.comp_unit->SetLineTable(line_table_ap.release());
1271                        return true;
1272                    }
1273                }
1274            }
1275        }
1276    }
1277    return false;
1278}
1279
1280size_t
1281SymbolFileDWARF::ParseFunctionBlocks
1282(
1283    const SymbolContext& sc,
1284    Block *parent_block,
1285    DWARFCompileUnit* dwarf_cu,
1286    const DWARFDebugInfoEntry *die,
1287    addr_t subprogram_low_pc,
1288    uint32_t depth
1289)
1290{
1291    size_t blocks_added = 0;
1292    while (die != NULL)
1293    {
1294        dw_tag_t tag = die->Tag();
1295
1296        switch (tag)
1297        {
1298        case DW_TAG_inlined_subroutine:
1299        case DW_TAG_subprogram:
1300        case DW_TAG_lexical_block:
1301            {
1302                Block *block = NULL;
1303                if (tag == DW_TAG_subprogram)
1304                {
1305                    // Skip any DW_TAG_subprogram DIEs that are inside
1306                    // of a normal or inlined functions. These will be
1307                    // parsed on their own as separate entities.
1308
1309                    if (depth > 0)
1310                        break;
1311
1312                    block = parent_block;
1313                }
1314                else
1315                {
1316                    BlockSP block_sp(new Block (MakeUserID(die->GetOffset())));
1317                    parent_block->AddChild(block_sp);
1318                    block = block_sp.get();
1319                }
1320                DWARFDebugRanges::RangeList ranges;
1321                const char *name = NULL;
1322                const char *mangled_name = NULL;
1323
1324                int decl_file = 0;
1325                int decl_line = 0;
1326                int decl_column = 0;
1327                int call_file = 0;
1328                int call_line = 0;
1329                int call_column = 0;
1330                if (die->GetDIENamesAndRanges (this,
1331                                               dwarf_cu,
1332                                               name,
1333                                               mangled_name,
1334                                               ranges,
1335                                               decl_file, decl_line, decl_column,
1336                                               call_file, call_line, call_column))
1337                {
1338                    if (tag == DW_TAG_subprogram)
1339                    {
1340                        assert (subprogram_low_pc == LLDB_INVALID_ADDRESS);
1341                        subprogram_low_pc = ranges.GetMinRangeBase(0);
1342                    }
1343                    else if (tag == DW_TAG_inlined_subroutine)
1344                    {
1345                        // We get called here for inlined subroutines in two ways.
1346                        // The first time is when we are making the Function object
1347                        // for this inlined concrete instance.  Since we're creating a top level block at
1348                        // here, the subprogram_low_pc will be LLDB_INVALID_ADDRESS.  So we need to
1349                        // adjust the containing address.
1350                        // The second time is when we are parsing the blocks inside the function that contains
1351                        // the inlined concrete instance.  Since these will be blocks inside the containing "real"
1352                        // function the offset will be for that function.
1353                        if (subprogram_low_pc == LLDB_INVALID_ADDRESS)
1354                        {
1355                            subprogram_low_pc = ranges.GetMinRangeBase(0);
1356                        }
1357                    }
1358
1359                    AddRangesToBlock (*block, ranges, subprogram_low_pc);
1360
1361                    if (tag != DW_TAG_subprogram && (name != NULL || mangled_name != NULL))
1362                    {
1363                        std::unique_ptr<Declaration> decl_ap;
1364                        if (decl_file != 0 || decl_line != 0 || decl_column != 0)
1365                            decl_ap.reset(new Declaration(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file),
1366                                                          decl_line, decl_column));
1367
1368                        std::unique_ptr<Declaration> call_ap;
1369                        if (call_file != 0 || call_line != 0 || call_column != 0)
1370                            call_ap.reset(new Declaration(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(call_file),
1371                                                          call_line, call_column));
1372
1373                        block->SetInlinedFunctionInfo (name, mangled_name, decl_ap.get(), call_ap.get());
1374                    }
1375
1376                    ++blocks_added;
1377
1378                    if (die->HasChildren())
1379                    {
1380                        blocks_added += ParseFunctionBlocks (sc,
1381                                                             block,
1382                                                             dwarf_cu,
1383                                                             die->GetFirstChild(),
1384                                                             subprogram_low_pc,
1385                                                             depth + 1);
1386                    }
1387                }
1388            }
1389            break;
1390        default:
1391            break;
1392        }
1393
1394        // Only parse siblings of the block if we are not at depth zero. A depth
1395        // of zero indicates we are currently parsing the top level
1396        // DW_TAG_subprogram DIE
1397
1398        if (depth == 0)
1399            die = NULL;
1400        else
1401            die = die->GetSibling();
1402    }
1403    return blocks_added;
1404}
1405
1406bool
1407SymbolFileDWARF::ParseTemplateDIE (DWARFCompileUnit* dwarf_cu,
1408                                   const DWARFDebugInfoEntry *die,
1409                                   ClangASTContext::TemplateParameterInfos &template_param_infos)
1410{
1411    const dw_tag_t tag = die->Tag();
1412
1413    switch (tag)
1414    {
1415    case DW_TAG_template_type_parameter:
1416    case DW_TAG_template_value_parameter:
1417        {
1418            const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize());
1419
1420            DWARFDebugInfoEntry::Attributes attributes;
1421            const size_t num_attributes = die->GetAttributes (this,
1422                                                              dwarf_cu,
1423                                                              fixed_form_sizes,
1424                                                              attributes);
1425            const char *name = NULL;
1426            Type *lldb_type = NULL;
1427            ClangASTType clang_type;
1428            uint64_t uval64 = 0;
1429            bool uval64_valid = false;
1430            if (num_attributes > 0)
1431            {
1432                DWARFFormValue form_value;
1433                for (size_t i=0; i<num_attributes; ++i)
1434                {
1435                    const dw_attr_t attr = attributes.AttributeAtIndex(i);
1436
1437                    switch (attr)
1438                    {
1439                        case DW_AT_name:
1440                            if (attributes.ExtractFormValueAtIndex(this, i, form_value))
1441                                name = form_value.AsCString(&get_debug_str_data());
1442                            break;
1443
1444                        case DW_AT_type:
1445                            if (attributes.ExtractFormValueAtIndex(this, i, form_value))
1446                            {
1447                                const dw_offset_t type_die_offset = form_value.Reference(dwarf_cu);
1448                                lldb_type = ResolveTypeUID(type_die_offset);
1449                                if (lldb_type)
1450                                    clang_type = lldb_type->GetClangForwardType();
1451                            }
1452                            break;
1453
1454                        case DW_AT_const_value:
1455                            if (attributes.ExtractFormValueAtIndex(this, i, form_value))
1456                            {
1457                                uval64_valid = true;
1458                                uval64 = form_value.Unsigned();
1459                            }
1460                            break;
1461                        default:
1462                            break;
1463                    }
1464                }
1465
1466                clang::ASTContext *ast = GetClangASTContext().getASTContext();
1467                if (!clang_type)
1468                    clang_type = GetClangASTContext().GetBasicType(eBasicTypeVoid);
1469
1470                if (clang_type)
1471                {
1472                    bool is_signed = false;
1473                    if (name && name[0])
1474                        template_param_infos.names.push_back(name);
1475                    else
1476                        template_param_infos.names.push_back(NULL);
1477
1478                    if (tag == DW_TAG_template_value_parameter &&
1479                        lldb_type != NULL &&
1480                        clang_type.IsIntegerType (is_signed) &&
1481                        uval64_valid)
1482                    {
1483                        llvm::APInt apint (lldb_type->GetByteSize() * 8, uval64, is_signed);
1484                        template_param_infos.args.push_back (clang::TemplateArgument (*ast,
1485                                                                                      llvm::APSInt(apint),
1486                                                                                      clang_type.GetQualType()));
1487                    }
1488                    else
1489                    {
1490                        template_param_infos.args.push_back (clang::TemplateArgument (clang_type.GetQualType()));
1491                    }
1492                }
1493                else
1494                {
1495                    return false;
1496                }
1497
1498            }
1499        }
1500        return true;
1501
1502    default:
1503        break;
1504    }
1505    return false;
1506}
1507
1508bool
1509SymbolFileDWARF::ParseTemplateParameterInfos (DWARFCompileUnit* dwarf_cu,
1510                                              const DWARFDebugInfoEntry *parent_die,
1511                                              ClangASTContext::TemplateParameterInfos &template_param_infos)
1512{
1513
1514    if (parent_die == NULL)
1515        return false;
1516
1517    Args template_parameter_names;
1518    for (const DWARFDebugInfoEntry *die = parent_die->GetFirstChild();
1519         die != NULL;
1520         die = die->GetSibling())
1521    {
1522        const dw_tag_t tag = die->Tag();
1523
1524        switch (tag)
1525        {
1526            case DW_TAG_template_type_parameter:
1527            case DW_TAG_template_value_parameter:
1528                ParseTemplateDIE (dwarf_cu, die, template_param_infos);
1529            break;
1530
1531        default:
1532            break;
1533        }
1534    }
1535    if (template_param_infos.args.empty())
1536        return false;
1537    return template_param_infos.args.size() == template_param_infos.names.size();
1538}
1539
1540clang::ClassTemplateDecl *
1541SymbolFileDWARF::ParseClassTemplateDecl (clang::DeclContext *decl_ctx,
1542                                         lldb::AccessType access_type,
1543                                         const char *parent_name,
1544                                         int tag_decl_kind,
1545                                         const ClangASTContext::TemplateParameterInfos &template_param_infos)
1546{
1547    if (template_param_infos.IsValid())
1548    {
1549        std::string template_basename(parent_name);
1550        template_basename.erase (template_basename.find('<'));
1551        ClangASTContext &ast = GetClangASTContext();
1552
1553        return ast.CreateClassTemplateDecl (decl_ctx,
1554                                            access_type,
1555                                            template_basename.c_str(),
1556                                            tag_decl_kind,
1557                                            template_param_infos);
1558    }
1559    return NULL;
1560}
1561
1562class SymbolFileDWARF::DelayedAddObjCClassProperty
1563{
1564public:
1565    DelayedAddObjCClassProperty
1566    (
1567        const ClangASTType     &class_opaque_type,
1568        const char             *property_name,
1569        const ClangASTType     &property_opaque_type,  // The property type is only required if you don't have an ivar decl
1570        clang::ObjCIvarDecl    *ivar_decl,
1571        const char             *property_setter_name,
1572        const char             *property_getter_name,
1573        uint32_t                property_attributes,
1574        const ClangASTMetadata *metadata
1575    ) :
1576        m_class_opaque_type     (class_opaque_type),
1577        m_property_name         (property_name),
1578        m_property_opaque_type  (property_opaque_type),
1579        m_ivar_decl             (ivar_decl),
1580        m_property_setter_name  (property_setter_name),
1581        m_property_getter_name  (property_getter_name),
1582        m_property_attributes   (property_attributes)
1583    {
1584        if (metadata != NULL)
1585        {
1586            m_metadata_ap.reset(new ClangASTMetadata());
1587            *m_metadata_ap = *metadata;
1588        }
1589    }
1590
1591    DelayedAddObjCClassProperty (const DelayedAddObjCClassProperty &rhs)
1592    {
1593        *this = rhs;
1594    }
1595
1596    DelayedAddObjCClassProperty& operator= (const DelayedAddObjCClassProperty &rhs)
1597    {
1598        m_class_opaque_type    = rhs.m_class_opaque_type;
1599        m_property_name        = rhs.m_property_name;
1600        m_property_opaque_type = rhs.m_property_opaque_type;
1601        m_ivar_decl            = rhs.m_ivar_decl;
1602        m_property_setter_name = rhs.m_property_setter_name;
1603        m_property_getter_name = rhs.m_property_getter_name;
1604        m_property_attributes  = rhs.m_property_attributes;
1605
1606        if (rhs.m_metadata_ap.get())
1607        {
1608            m_metadata_ap.reset (new ClangASTMetadata());
1609            *m_metadata_ap = *rhs.m_metadata_ap;
1610        }
1611        return *this;
1612    }
1613
1614    bool
1615    Finalize()
1616    {
1617        return m_class_opaque_type.AddObjCClassProperty (m_property_name,
1618                                                         m_property_opaque_type,
1619                                                         m_ivar_decl,
1620                                                         m_property_setter_name,
1621                                                         m_property_getter_name,
1622                                                         m_property_attributes,
1623                                                         m_metadata_ap.get());
1624    }
1625private:
1626    ClangASTType            m_class_opaque_type;
1627    const char             *m_property_name;
1628    ClangASTType            m_property_opaque_type;
1629    clang::ObjCIvarDecl    *m_ivar_decl;
1630    const char             *m_property_setter_name;
1631    const char             *m_property_getter_name;
1632    uint32_t                m_property_attributes;
1633    std::unique_ptr<ClangASTMetadata> m_metadata_ap;
1634};
1635
1636struct BitfieldInfo
1637{
1638    uint64_t bit_size;
1639    uint64_t bit_offset;
1640
1641    BitfieldInfo () :
1642        bit_size (LLDB_INVALID_ADDRESS),
1643        bit_offset (LLDB_INVALID_ADDRESS)
1644    {
1645    }
1646
1647    void
1648    Clear()
1649    {
1650        bit_size = LLDB_INVALID_ADDRESS;
1651        bit_offset = LLDB_INVALID_ADDRESS;
1652    }
1653
1654    bool IsValid ()
1655    {
1656        return (bit_size != LLDB_INVALID_ADDRESS) &&
1657               (bit_offset != LLDB_INVALID_ADDRESS);
1658    }
1659};
1660
1661
1662bool
1663SymbolFileDWARF::ClassOrStructIsVirtual (DWARFCompileUnit* dwarf_cu,
1664                                         const DWARFDebugInfoEntry *parent_die)
1665{
1666    if (parent_die)
1667    {
1668        for (const DWARFDebugInfoEntry *die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling())
1669        {
1670            dw_tag_t tag = die->Tag();
1671            bool check_virtuality = false;
1672            switch (tag)
1673            {
1674                case DW_TAG_inheritance:
1675                case DW_TAG_subprogram:
1676                    check_virtuality = true;
1677                    break;
1678                default:
1679                    break;
1680            }
1681            if (check_virtuality)
1682            {
1683                if (die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_virtuality, 0) != 0)
1684                    return true;
1685            }
1686        }
1687    }
1688    return false;
1689}
1690
1691size_t
1692SymbolFileDWARF::ParseChildMembers
1693(
1694    const SymbolContext& sc,
1695    DWARFCompileUnit* dwarf_cu,
1696    const DWARFDebugInfoEntry *parent_die,
1697    ClangASTType &class_clang_type,
1698    const LanguageType class_language,
1699    std::vector<clang::CXXBaseSpecifier *>& base_classes,
1700    std::vector<int>& member_accessibilities,
1701    DWARFDIECollection& member_function_dies,
1702    DelayedPropertyList& delayed_properties,
1703    AccessType& default_accessibility,
1704    bool &is_a_class,
1705    LayoutInfo &layout_info
1706)
1707{
1708    if (parent_die == NULL)
1709        return 0;
1710
1711    size_t count = 0;
1712    const DWARFDebugInfoEntry *die;
1713    const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize());
1714    uint32_t member_idx = 0;
1715    BitfieldInfo last_field_info;
1716    ModuleSP module = GetObjectFile()->GetModule();
1717
1718    for (die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling())
1719    {
1720        dw_tag_t tag = die->Tag();
1721
1722        switch (tag)
1723        {
1724        case DW_TAG_member:
1725        case DW_TAG_APPLE_property:
1726            {
1727                DWARFDebugInfoEntry::Attributes attributes;
1728                const size_t num_attributes = die->GetAttributes (this,
1729                                                                  dwarf_cu,
1730                                                                  fixed_form_sizes,
1731                                                                  attributes);
1732                if (num_attributes > 0)
1733                {
1734                    Declaration decl;
1735                    //DWARFExpression location;
1736                    const char *name = NULL;
1737                    const char *prop_name = NULL;
1738                    const char *prop_getter_name = NULL;
1739                    const char *prop_setter_name = NULL;
1740                    uint32_t prop_attributes = 0;
1741
1742
1743                    bool is_artificial = false;
1744                    lldb::user_id_t encoding_uid = LLDB_INVALID_UID;
1745                    AccessType accessibility = eAccessNone;
1746                    uint32_t member_byte_offset = UINT32_MAX;
1747                    size_t byte_size = 0;
1748                    size_t bit_offset = 0;
1749                    size_t bit_size = 0;
1750                    bool is_external = false; // On DW_TAG_members, this means the member is static
1751                    uint32_t i;
1752                    for (i=0; i<num_attributes && !is_artificial; ++i)
1753                    {
1754                        const dw_attr_t attr = attributes.AttributeAtIndex(i);
1755                        DWARFFormValue form_value;
1756                        if (attributes.ExtractFormValueAtIndex(this, i, form_value))
1757                        {
1758                            switch (attr)
1759                            {
1760                            case DW_AT_decl_file:   decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break;
1761                            case DW_AT_decl_line:   decl.SetLine(form_value.Unsigned()); break;
1762                            case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
1763                            case DW_AT_name:        name = form_value.AsCString(&get_debug_str_data()); break;
1764                            case DW_AT_type:        encoding_uid = form_value.Reference(dwarf_cu); break;
1765                            case DW_AT_bit_offset:  bit_offset = form_value.Unsigned(); break;
1766                            case DW_AT_bit_size:    bit_size = form_value.Unsigned(); break;
1767                            case DW_AT_byte_size:   byte_size = form_value.Unsigned(); break;
1768                            case DW_AT_data_member_location:
1769                                if (form_value.BlockData())
1770                                {
1771                                    Value initialValue(0);
1772                                    Value memberOffset(0);
1773                                    const DWARFDataExtractor& debug_info_data = get_debug_info_data();
1774                                    uint32_t block_length = form_value.Unsigned();
1775                                    uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart();
1776                                    if (DWARFExpression::Evaluate(NULL, // ExecutionContext *
1777                                                                  NULL, // ClangExpressionVariableList *
1778                                                                  NULL, // ClangExpressionDeclMap *
1779                                                                  NULL, // RegisterContext *
1780                                                                  module,
1781                                                                  debug_info_data,
1782                                                                  block_offset,
1783                                                                  block_length,
1784                                                                  eRegisterKindDWARF,
1785                                                                  &initialValue,
1786                                                                  memberOffset,
1787                                                                  NULL))
1788                                    {
1789                                        member_byte_offset = memberOffset.ResolveValue(NULL).UInt();
1790                                    }
1791                                }
1792                                else
1793                                {
1794                                    // With DWARF 3 and later, if the value is an integer constant,
1795                                    // this form value is the offset in bytes from the beginning
1796                                    // of the containing entity.
1797                                    member_byte_offset = form_value.Unsigned();
1798                                }
1799                                break;
1800
1801                            case DW_AT_accessibility: accessibility = DW_ACCESS_to_AccessType (form_value.Unsigned()); break;
1802                            case DW_AT_artificial: is_artificial = form_value.Boolean(); break;
1803                            case DW_AT_APPLE_property_name:      prop_name = form_value.AsCString(&get_debug_str_data()); break;
1804                            case DW_AT_APPLE_property_getter:    prop_getter_name = form_value.AsCString(&get_debug_str_data()); break;
1805                            case DW_AT_APPLE_property_setter:    prop_setter_name = form_value.AsCString(&get_debug_str_data()); break;
1806                            case DW_AT_APPLE_property_attribute: prop_attributes = form_value.Unsigned(); break;
1807                            case DW_AT_external:                 is_external = form_value.Boolean(); break;
1808
1809                            default:
1810                            case DW_AT_declaration:
1811                            case DW_AT_description:
1812                            case DW_AT_mutable:
1813                            case DW_AT_visibility:
1814                            case DW_AT_sibling:
1815                                break;
1816                            }
1817                        }
1818                    }
1819
1820                    if (prop_name)
1821                    {
1822                        ConstString fixed_getter;
1823                        ConstString fixed_setter;
1824
1825                        // Check if the property getter/setter were provided as full
1826                        // names.  We want basenames, so we extract them.
1827
1828                        if (prop_getter_name && prop_getter_name[0] == '-')
1829                        {
1830                            ObjCLanguageRuntime::MethodName prop_getter_method(prop_getter_name, true);
1831                            prop_getter_name = prop_getter_method.GetSelector().GetCString();
1832                        }
1833
1834                        if (prop_setter_name && prop_setter_name[0] == '-')
1835                        {
1836                            ObjCLanguageRuntime::MethodName prop_setter_method(prop_setter_name, true);
1837                            prop_setter_name = prop_setter_method.GetSelector().GetCString();
1838                        }
1839
1840                        // If the names haven't been provided, they need to be
1841                        // filled in.
1842
1843                        if (!prop_getter_name)
1844                        {
1845                            prop_getter_name = prop_name;
1846                        }
1847                        if (!prop_setter_name && prop_name[0] && !(prop_attributes & DW_APPLE_PROPERTY_readonly))
1848                        {
1849                            StreamString ss;
1850
1851                            ss.Printf("set%c%s:",
1852                                      toupper(prop_name[0]),
1853                                      &prop_name[1]);
1854
1855                            fixed_setter.SetCString(ss.GetData());
1856                            prop_setter_name = fixed_setter.GetCString();
1857                        }
1858                    }
1859
1860                    // Clang has a DWARF generation bug where sometimes it
1861                    // represents fields that are references with bad byte size
1862                    // and bit size/offset information such as:
1863                    //
1864                    //  DW_AT_byte_size( 0x00 )
1865                    //  DW_AT_bit_size( 0x40 )
1866                    //  DW_AT_bit_offset( 0xffffffffffffffc0 )
1867                    //
1868                    // So check the bit offset to make sure it is sane, and if
1869                    // the values are not sane, remove them. If we don't do this
1870                    // then we will end up with a crash if we try to use this
1871                    // type in an expression when clang becomes unhappy with its
1872                    // recycled debug info.
1873
1874                    if (bit_offset > 128)
1875                    {
1876                        bit_size = 0;
1877                        bit_offset = 0;
1878                    }
1879
1880                    // FIXME: Make Clang ignore Objective-C accessibility for expressions
1881                    if (class_language == eLanguageTypeObjC ||
1882                        class_language == eLanguageTypeObjC_plus_plus)
1883                        accessibility = eAccessNone;
1884
1885                    if (member_idx == 0 && !is_artificial && name && (strstr (name, "_vptr$") == name))
1886                    {
1887                        // Not all compilers will mark the vtable pointer
1888                        // member as artificial (llvm-gcc). We can't have
1889                        // the virtual members in our classes otherwise it
1890                        // throws off all child offsets since we end up
1891                        // having and extra pointer sized member in our
1892                        // class layouts.
1893                        is_artificial = true;
1894                    }
1895
1896                    // Handle static members
1897                    if (is_external && member_byte_offset == UINT32_MAX)
1898                    {
1899                        Type *var_type = ResolveTypeUID(encoding_uid);
1900
1901                        if (var_type)
1902                        {
1903                            if (accessibility == eAccessNone)
1904                                accessibility = eAccessPublic;
1905                            class_clang_type.AddVariableToRecordType (name,
1906                                                                      var_type->GetClangLayoutType(),
1907                                                                      accessibility);
1908                        }
1909                        break;
1910                    }
1911
1912                    if (is_artificial == false)
1913                    {
1914                        Type *member_type = ResolveTypeUID(encoding_uid);
1915
1916                        clang::FieldDecl *field_decl = NULL;
1917                        if (tag == DW_TAG_member)
1918                        {
1919                            if (member_type)
1920                            {
1921                                if (accessibility == eAccessNone)
1922                                    accessibility = default_accessibility;
1923                                member_accessibilities.push_back(accessibility);
1924
1925                                uint64_t field_bit_offset = (member_byte_offset == UINT32_MAX ? 0 : (member_byte_offset * 8));
1926                                if (bit_size > 0)
1927                                {
1928
1929                                    BitfieldInfo this_field_info;
1930                                    this_field_info.bit_offset = field_bit_offset;
1931                                    this_field_info.bit_size = bit_size;
1932
1933                                    /////////////////////////////////////////////////////////////
1934                                    // How to locate a field given the DWARF debug information
1935                                    //
1936                                    // AT_byte_size indicates the size of the word in which the
1937                                    // bit offset must be interpreted.
1938                                    //
1939                                    // AT_data_member_location indicates the byte offset of the
1940                                    // word from the base address of the structure.
1941                                    //
1942                                    // AT_bit_offset indicates how many bits into the word
1943                                    // (according to the host endianness) the low-order bit of
1944                                    // the field starts.  AT_bit_offset can be negative.
1945                                    //
1946                                    // AT_bit_size indicates the size of the field in bits.
1947                                    /////////////////////////////////////////////////////////////
1948
1949                                    if (byte_size == 0)
1950                                        byte_size = member_type->GetByteSize();
1951
1952                                    if (GetObjectFile()->GetByteOrder() == eByteOrderLittle)
1953                                    {
1954                                        this_field_info.bit_offset += byte_size * 8;
1955                                        this_field_info.bit_offset -= (bit_offset + bit_size);
1956                                    }
1957                                    else
1958                                    {
1959                                        this_field_info.bit_offset += bit_offset;
1960                                    }
1961
1962                                    // Update the field bit offset we will report for layout
1963                                    field_bit_offset = this_field_info.bit_offset;
1964
1965                                    // If the member to be emitted did not start on a character boundary and there is
1966                                    // empty space between the last field and this one, then we need to emit an
1967                                    // anonymous member filling up the space up to its start.  There are three cases
1968                                    // here:
1969                                    //
1970                                    // 1 If the previous member ended on a character boundary, then we can emit an
1971                                    //   anonymous member starting at the most recent character boundary.
1972                                    //
1973                                    // 2 If the previous member did not end on a character boundary and the distance
1974                                    //   from the end of the previous member to the current member is less than a
1975                                    //   word width, then we can emit an anonymous member starting right after the
1976                                    //   previous member and right before this member.
1977                                    //
1978                                    // 3 If the previous member did not end on a character boundary and the distance
1979                                    //   from the end of the previous member to the current member is greater than
1980                                    //   or equal a word width, then we act as in Case 1.
1981
1982                                    const uint64_t character_width = 8;
1983                                    const uint64_t word_width = 32;
1984
1985                                    // Objective-C has invalid DW_AT_bit_offset values in older versions
1986                                    // of clang, so we have to be careful and only insert unnammed bitfields
1987                                    // if we have a new enough clang.
1988                                    bool detect_unnamed_bitfields = true;
1989
1990                                    if (class_language == eLanguageTypeObjC || class_language == eLanguageTypeObjC_plus_plus)
1991                                        detect_unnamed_bitfields = dwarf_cu->Supports_unnamed_objc_bitfields ();
1992
1993                                    if (detect_unnamed_bitfields)
1994                                    {
1995                                        BitfieldInfo anon_field_info;
1996
1997                                        if ((this_field_info.bit_offset % character_width) != 0) // not char aligned
1998                                        {
1999                                            uint64_t last_field_end = 0;
2000
2001                                            if (last_field_info.IsValid())
2002                                                last_field_end = last_field_info.bit_offset + last_field_info.bit_size;
2003
2004                                            if (this_field_info.bit_offset != last_field_end)
2005                                            {
2006                                                if (((last_field_end % character_width) == 0) ||                    // case 1
2007                                                    (this_field_info.bit_offset - last_field_end >= word_width))    // case 3
2008                                                {
2009                                                    anon_field_info.bit_size = this_field_info.bit_offset % character_width;
2010                                                    anon_field_info.bit_offset = this_field_info.bit_offset - anon_field_info.bit_size;
2011                                                }
2012                                                else                                                                // case 2
2013                                                {
2014                                                    anon_field_info.bit_size = this_field_info.bit_offset - last_field_end;
2015                                                    anon_field_info.bit_offset = last_field_end;
2016                                                }
2017                                            }
2018                                        }
2019
2020                                        if (anon_field_info.IsValid())
2021                                        {
2022                                            clang::FieldDecl *unnamed_bitfield_decl = class_clang_type.AddFieldToRecordType (NULL,
2023                                                                                                                             GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, word_width),
2024                                                                                                                             accessibility,
2025                                                                                                                             anon_field_info.bit_size);
2026
2027                                            layout_info.field_offsets.insert(std::make_pair(unnamed_bitfield_decl, anon_field_info.bit_offset));
2028                                        }
2029                                    }
2030                                    last_field_info = this_field_info;
2031                                }
2032                                else
2033                                {
2034                                    last_field_info.Clear();
2035                                }
2036
2037                                ClangASTType member_clang_type = member_type->GetClangLayoutType();
2038
2039                                {
2040                                    // Older versions of clang emit array[0] and array[1] in the same way (<rdar://problem/12566646>).
2041                                    // If the current field is at the end of the structure, then there is definitely no room for extra
2042                                    // elements and we override the type to array[0].
2043
2044                                    ClangASTType member_array_element_type;
2045                                    uint64_t member_array_size;
2046                                    bool member_array_is_incomplete;
2047
2048                                    if (member_clang_type.IsArrayType(&member_array_element_type,
2049                                                                      &member_array_size,
2050                                                                      &member_array_is_incomplete) &&
2051                                        !member_array_is_incomplete)
2052                                    {
2053                                        uint64_t parent_byte_size = parent_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_byte_size, UINT64_MAX);
2054
2055                                        if (member_byte_offset >= parent_byte_size)
2056                                        {
2057                                            if (member_array_size != 1)
2058                                            {
2059                                                GetObjectFile()->GetModule()->ReportError ("0x%8.8" PRIx64 ": DW_TAG_member '%s' refers to type 0x%8.8" PRIx64 " which extends beyond the bounds of 0x%8.8" PRIx64,
2060                                                                                           MakeUserID(die->GetOffset()),
2061                                                                                           name,
2062                                                                                           encoding_uid,
2063                                                                                           MakeUserID(parent_die->GetOffset()));
2064                                            }
2065
2066                                            member_clang_type = GetClangASTContext().CreateArrayType(member_array_element_type, 0, false);
2067                                        }
2068                                    }
2069                                }
2070
2071                                field_decl = class_clang_type.AddFieldToRecordType (name,
2072                                                                                    member_clang_type,
2073                                                                                    accessibility,
2074                                                                                    bit_size);
2075
2076                                GetClangASTContext().SetMetadataAsUserID (field_decl, MakeUserID(die->GetOffset()));
2077
2078                                layout_info.field_offsets.insert(std::make_pair(field_decl, field_bit_offset));
2079
2080                            }
2081                            else
2082                            {
2083                                if (name)
2084                                    GetObjectFile()->GetModule()->ReportError ("0x%8.8" PRIx64 ": DW_TAG_member '%s' refers to type 0x%8.8" PRIx64 " which was unable to be parsed",
2085                                                                               MakeUserID(die->GetOffset()),
2086                                                                               name,
2087                                                                               encoding_uid);
2088                                else
2089                                    GetObjectFile()->GetModule()->ReportError ("0x%8.8" PRIx64 ": DW_TAG_member refers to type 0x%8.8" PRIx64 " which was unable to be parsed",
2090                                                                               MakeUserID(die->GetOffset()),
2091                                                                               encoding_uid);
2092                            }
2093                        }
2094
2095                        if (prop_name != NULL)
2096                        {
2097                            clang::ObjCIvarDecl *ivar_decl = NULL;
2098
2099                            if (field_decl)
2100                            {
2101                                ivar_decl = clang::dyn_cast<clang::ObjCIvarDecl>(field_decl);
2102                                assert (ivar_decl != NULL);
2103                            }
2104
2105                            ClangASTMetadata metadata;
2106                            metadata.SetUserID (MakeUserID(die->GetOffset()));
2107                            delayed_properties.push_back(DelayedAddObjCClassProperty(class_clang_type,
2108                                                                                     prop_name,
2109                                                                                     member_type->GetClangLayoutType(),
2110                                                                                     ivar_decl,
2111                                                                                     prop_setter_name,
2112                                                                                     prop_getter_name,
2113                                                                                     prop_attributes,
2114                                                                                     &metadata));
2115
2116                            if (ivar_decl)
2117                                GetClangASTContext().SetMetadataAsUserID (ivar_decl, MakeUserID(die->GetOffset()));
2118                        }
2119                    }
2120                }
2121                ++member_idx;
2122            }
2123            break;
2124
2125        case DW_TAG_subprogram:
2126            // Let the type parsing code handle this one for us.
2127            member_function_dies.Append (die);
2128            break;
2129
2130        case DW_TAG_inheritance:
2131            {
2132                is_a_class = true;
2133                if (default_accessibility == eAccessNone)
2134                    default_accessibility = eAccessPrivate;
2135                // TODO: implement DW_TAG_inheritance type parsing
2136                DWARFDebugInfoEntry::Attributes attributes;
2137                const size_t num_attributes = die->GetAttributes (this,
2138                                                                  dwarf_cu,
2139                                                                  fixed_form_sizes,
2140                                                                  attributes);
2141                if (num_attributes > 0)
2142                {
2143                    Declaration decl;
2144                    DWARFExpression location;
2145                    lldb::user_id_t encoding_uid = LLDB_INVALID_UID;
2146                    AccessType accessibility = default_accessibility;
2147                    bool is_virtual = false;
2148                    bool is_base_of_class = true;
2149                    off_t member_byte_offset = 0;
2150                    uint32_t i;
2151                    for (i=0; i<num_attributes; ++i)
2152                    {
2153                        const dw_attr_t attr = attributes.AttributeAtIndex(i);
2154                        DWARFFormValue form_value;
2155                        if (attributes.ExtractFormValueAtIndex(this, i, form_value))
2156                        {
2157                            switch (attr)
2158                            {
2159                            case DW_AT_decl_file:   decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break;
2160                            case DW_AT_decl_line:   decl.SetLine(form_value.Unsigned()); break;
2161                            case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
2162                            case DW_AT_type:        encoding_uid = form_value.Reference(dwarf_cu); break;
2163                            case DW_AT_data_member_location:
2164                                if (form_value.BlockData())
2165                                {
2166                                    Value initialValue(0);
2167                                    Value memberOffset(0);
2168                                    const DWARFDataExtractor& debug_info_data = get_debug_info_data();
2169                                    uint32_t block_length = form_value.Unsigned();
2170                                    uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart();
2171                                    if (DWARFExpression::Evaluate (NULL,
2172                                                                   NULL,
2173                                                                   NULL,
2174                                                                   NULL,
2175                                                                   module,
2176                                                                   debug_info_data,
2177                                                                   block_offset,
2178                                                                   block_length,
2179                                                                   eRegisterKindDWARF,
2180                                                                   &initialValue,
2181                                                                   memberOffset,
2182                                                                   NULL))
2183                                    {
2184                                        member_byte_offset = memberOffset.ResolveValue(NULL).UInt();
2185                                    }
2186                                }
2187                                else
2188                                {
2189                                    // With DWARF 3 and later, if the value is an integer constant,
2190                                    // this form value is the offset in bytes from the beginning
2191                                    // of the containing entity.
2192                                    member_byte_offset = form_value.Unsigned();
2193                                }
2194                                break;
2195
2196                            case DW_AT_accessibility:
2197                                accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned());
2198                                break;
2199
2200                            case DW_AT_virtuality:
2201                                is_virtual = form_value.Boolean();
2202                                break;
2203
2204                            case DW_AT_sibling:
2205                                break;
2206
2207                            default:
2208                                break;
2209                            }
2210                        }
2211                    }
2212
2213                    Type *base_class_type = ResolveTypeUID(encoding_uid);
2214                    assert(base_class_type);
2215
2216                    ClangASTType base_class_clang_type = base_class_type->GetClangFullType();
2217                    assert (base_class_clang_type);
2218                    if (class_language == eLanguageTypeObjC)
2219                    {
2220                        class_clang_type.SetObjCSuperClass(base_class_clang_type);
2221                    }
2222                    else
2223                    {
2224                        base_classes.push_back (base_class_clang_type.CreateBaseClassSpecifier (accessibility,
2225                                                                                               is_virtual,
2226                                                                                               is_base_of_class));
2227
2228                        if (is_virtual)
2229                        {
2230                            // Do not specify any offset for virtual inheritance. The DWARF produced by clang doesn't
2231                            // give us a constant offset, but gives us a DWARF expressions that requires an actual object
2232                            // in memory. the DW_AT_data_member_location for a virtual base class looks like:
2233                            //      DW_AT_data_member_location( DW_OP_dup, DW_OP_deref, DW_OP_constu(0x00000018), DW_OP_minus, DW_OP_deref, DW_OP_plus )
2234                            // Given this, there is really no valid response we can give to clang for virtual base
2235                            // class offsets, and this should eventually be removed from LayoutRecordType() in the external
2236                            // AST source in clang.
2237                        }
2238                        else
2239                        {
2240                            layout_info.base_offsets.insert(std::make_pair(base_class_clang_type.GetAsCXXRecordDecl(),
2241                                                                           clang::CharUnits::fromQuantity(member_byte_offset)));
2242                        }
2243                    }
2244                }
2245            }
2246            break;
2247
2248        default:
2249            break;
2250        }
2251    }
2252
2253    return count;
2254}
2255
2256
2257clang::DeclContext*
2258SymbolFileDWARF::GetClangDeclContextContainingTypeUID (lldb::user_id_t type_uid)
2259{
2260    DWARFDebugInfo* debug_info = DebugInfo();
2261    if (debug_info && UserIDMatches(type_uid))
2262    {
2263        DWARFCompileUnitSP cu_sp;
2264        const DWARFDebugInfoEntry* die = debug_info->GetDIEPtr(type_uid, &cu_sp);
2265        if (die)
2266            return GetClangDeclContextContainingDIE (cu_sp.get(), die, NULL);
2267    }
2268    return NULL;
2269}
2270
2271clang::DeclContext*
2272SymbolFileDWARF::GetClangDeclContextForTypeUID (const lldb_private::SymbolContext &sc, lldb::user_id_t type_uid)
2273{
2274    if (UserIDMatches(type_uid))
2275        return GetClangDeclContextForDIEOffset (sc, type_uid);
2276    return NULL;
2277}
2278
2279Type*
2280SymbolFileDWARF::ResolveTypeUID (lldb::user_id_t type_uid)
2281{
2282    if (UserIDMatches(type_uid))
2283    {
2284        DWARFDebugInfo* debug_info = DebugInfo();
2285        if (debug_info)
2286        {
2287            DWARFCompileUnitSP cu_sp;
2288            const DWARFDebugInfoEntry* type_die = debug_info->GetDIEPtr(type_uid, &cu_sp);
2289            const bool assert_not_being_parsed = true;
2290            return ResolveTypeUID (cu_sp.get(), type_die, assert_not_being_parsed);
2291        }
2292    }
2293    return NULL;
2294}
2295
2296Type*
2297SymbolFileDWARF::ResolveTypeUID (DWARFCompileUnit* cu, const DWARFDebugInfoEntry* die, bool assert_not_being_parsed)
2298{
2299    if (die != NULL)
2300    {
2301        Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO));
2302        if (log)
2303            GetObjectFile()->GetModule()->LogMessage (log,
2304                                                      "SymbolFileDWARF::ResolveTypeUID (die = 0x%8.8x) %s '%s'",
2305                                                      die->GetOffset(),
2306                                                      DW_TAG_value_to_name(die->Tag()),
2307                                                      die->GetName(this, cu));
2308
2309        // We might be coming in in the middle of a type tree (a class
2310        // withing a class, an enum within a class), so parse any needed
2311        // parent DIEs before we get to this one...
2312        const DWARFDebugInfoEntry *decl_ctx_die = GetDeclContextDIEContainingDIE (cu, die);
2313        switch (decl_ctx_die->Tag())
2314        {
2315            case DW_TAG_structure_type:
2316            case DW_TAG_union_type:
2317            case DW_TAG_class_type:
2318            {
2319                // Get the type, which could be a forward declaration
2320                if (log)
2321                    GetObjectFile()->GetModule()->LogMessage (log,
2322                                                              "SymbolFileDWARF::ResolveTypeUID (die = 0x%8.8x) %s '%s' resolve parent forward type for 0x%8.8x",
2323                                                              die->GetOffset(),
2324                                                              DW_TAG_value_to_name(die->Tag()),
2325                                                              die->GetName(this, cu),
2326                                                              decl_ctx_die->GetOffset());
2327//
2328//                Type *parent_type = ResolveTypeUID (cu, decl_ctx_die, assert_not_being_parsed);
2329//                if (child_requires_parent_class_union_or_struct_to_be_completed(die->Tag()))
2330//                {
2331//                    if (log)
2332//                        GetObjectFile()->GetModule()->LogMessage (log,
2333//                                                                  "SymbolFileDWARF::ResolveTypeUID (die = 0x%8.8x) %s '%s' resolve parent full type for 0x%8.8x since die is a function",
2334//                                                                  die->GetOffset(),
2335//                                                                  DW_TAG_value_to_name(die->Tag()),
2336//                                                                  die->GetName(this, cu),
2337//                                                                  decl_ctx_die->GetOffset());
2338//                    // Ask the type to complete itself if it already hasn't since if we
2339//                    // want a function (method or static) from a class, the class must
2340//                    // create itself and add it's own methods and class functions.
2341//                    if (parent_type)
2342//                        parent_type->GetClangFullType();
2343//                }
2344            }
2345            break;
2346
2347            default:
2348                break;
2349        }
2350        return ResolveType (cu, die);
2351    }
2352    return NULL;
2353}
2354
2355// This function is used when SymbolFileDWARFDebugMap owns a bunch of
2356// SymbolFileDWARF objects to detect if this DWARF file is the one that
2357// can resolve a clang_type.
2358bool
2359SymbolFileDWARF::HasForwardDeclForClangType (const ClangASTType &clang_type)
2360{
2361    ClangASTType clang_type_no_qualifiers = clang_type.RemoveFastQualifiers();
2362    const DWARFDebugInfoEntry* die = m_forward_decl_clang_type_to_die.lookup (clang_type_no_qualifiers.GetOpaqueQualType());
2363    return die != NULL;
2364}
2365
2366
2367bool
2368SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (ClangASTType &clang_type)
2369{
2370    // We have a struct/union/class/enum that needs to be fully resolved.
2371    ClangASTType clang_type_no_qualifiers = clang_type.RemoveFastQualifiers();
2372    const DWARFDebugInfoEntry* die = m_forward_decl_clang_type_to_die.lookup (clang_type_no_qualifiers.GetOpaqueQualType());
2373    if (die == NULL)
2374    {
2375        // We have already resolved this type...
2376        return true;
2377    }
2378    // Once we start resolving this type, remove it from the forward declaration
2379    // map in case anyone child members or other types require this type to get resolved.
2380    // The type will get resolved when all of the calls to SymbolFileDWARF::ResolveClangOpaqueTypeDefinition
2381    // are done.
2382    m_forward_decl_clang_type_to_die.erase (clang_type_no_qualifiers.GetOpaqueQualType());
2383
2384
2385    // Disable external storage for this type so we don't get anymore
2386    // clang::ExternalASTSource queries for this type.
2387    clang_type.SetHasExternalStorage (false);
2388
2389    DWARFDebugInfo* debug_info = DebugInfo();
2390
2391    DWARFCompileUnit *dwarf_cu = debug_info->GetCompileUnitContainingDIE (die->GetOffset()).get();
2392    Type *type = m_die_to_type.lookup (die);
2393
2394    const dw_tag_t tag = die->Tag();
2395
2396    Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO|DWARF_LOG_TYPE_COMPLETION));
2397    if (log)
2398    {
2399        GetObjectFile()->GetModule()->LogMessageVerboseBacktrace (log,
2400                                                                  "0x%8.8" PRIx64 ": %s '%s' resolving forward declaration...",
2401                                                                  MakeUserID(die->GetOffset()),
2402                                                                  DW_TAG_value_to_name(tag),
2403                                                                  type->GetName().AsCString());
2404
2405    }
2406    assert (clang_type);
2407    DWARFDebugInfoEntry::Attributes attributes;
2408
2409    switch (tag)
2410    {
2411    case DW_TAG_structure_type:
2412    case DW_TAG_union_type:
2413    case DW_TAG_class_type:
2414        {
2415            LayoutInfo layout_info;
2416
2417            {
2418                if (die->HasChildren())
2419                {
2420
2421                    LanguageType class_language = eLanguageTypeUnknown;
2422                    if (clang_type.IsObjCObjectOrInterfaceType())
2423                    {
2424                        class_language = eLanguageTypeObjC;
2425                        // For objective C we don't start the definition when
2426                        // the class is created.
2427                        clang_type.StartTagDeclarationDefinition ();
2428                    }
2429
2430                    int tag_decl_kind = -1;
2431                    AccessType default_accessibility = eAccessNone;
2432                    if (tag == DW_TAG_structure_type)
2433                    {
2434                        tag_decl_kind = clang::TTK_Struct;
2435                        default_accessibility = eAccessPublic;
2436                    }
2437                    else if (tag == DW_TAG_union_type)
2438                    {
2439                        tag_decl_kind = clang::TTK_Union;
2440                        default_accessibility = eAccessPublic;
2441                    }
2442                    else if (tag == DW_TAG_class_type)
2443                    {
2444                        tag_decl_kind = clang::TTK_Class;
2445                        default_accessibility = eAccessPrivate;
2446                    }
2447
2448                    SymbolContext sc(GetCompUnitForDWARFCompUnit(dwarf_cu));
2449                    std::vector<clang::CXXBaseSpecifier *> base_classes;
2450                    std::vector<int> member_accessibilities;
2451                    bool is_a_class = false;
2452                    // Parse members and base classes first
2453                    DWARFDIECollection member_function_dies;
2454
2455                    DelayedPropertyList delayed_properties;
2456                    ParseChildMembers (sc,
2457                                       dwarf_cu,
2458                                       die,
2459                                       clang_type,
2460                                       class_language,
2461                                       base_classes,
2462                                       member_accessibilities,
2463                                       member_function_dies,
2464                                       delayed_properties,
2465                                       default_accessibility,
2466                                       is_a_class,
2467                                       layout_info);
2468
2469                    // Now parse any methods if there were any...
2470                    size_t num_functions = member_function_dies.Size();
2471                    if (num_functions > 0)
2472                    {
2473                        for (size_t i=0; i<num_functions; ++i)
2474                        {
2475                            ResolveType(dwarf_cu, member_function_dies.GetDIEPtrAtIndex(i));
2476                        }
2477                    }
2478
2479                    if (class_language == eLanguageTypeObjC)
2480                    {
2481                        ConstString class_name (clang_type.GetTypeName());
2482                        if (class_name)
2483                        {
2484
2485                            DIEArray method_die_offsets;
2486                            if (m_using_apple_tables)
2487                            {
2488                                if (m_apple_objc_ap.get())
2489                                    m_apple_objc_ap->FindByName(class_name.GetCString(), method_die_offsets);
2490                            }
2491                            else
2492                            {
2493                                if (!m_indexed)
2494                                    Index ();
2495
2496                                m_objc_class_selectors_index.Find (class_name, method_die_offsets);
2497                            }
2498
2499                            if (!method_die_offsets.empty())
2500                            {
2501                                DWARFDebugInfo* debug_info = DebugInfo();
2502
2503                                DWARFCompileUnit* method_cu = NULL;
2504                                const size_t num_matches = method_die_offsets.size();
2505                                for (size_t i=0; i<num_matches; ++i)
2506                                {
2507                                    const dw_offset_t die_offset = method_die_offsets[i];
2508                                    DWARFDebugInfoEntry *method_die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &method_cu);
2509
2510                                    if (method_die)
2511                                        ResolveType (method_cu, method_die);
2512                                    else
2513                                    {
2514                                        if (m_using_apple_tables)
2515                                        {
2516                                            GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_objc accelerator table had bad die 0x%8.8x for '%s')\n",
2517                                                                                                       die_offset, class_name.GetCString());
2518                                        }
2519                                    }
2520                                }
2521                            }
2522
2523                            for (DelayedPropertyList::iterator pi = delayed_properties.begin(), pe = delayed_properties.end();
2524                                 pi != pe;
2525                                 ++pi)
2526                                pi->Finalize();
2527                        }
2528                    }
2529
2530                    // If we have a DW_TAG_structure_type instead of a DW_TAG_class_type we
2531                    // need to tell the clang type it is actually a class.
2532                    if (class_language != eLanguageTypeObjC)
2533                    {
2534                        if (is_a_class && tag_decl_kind != clang::TTK_Class)
2535                            clang_type.SetTagTypeKind (clang::TTK_Class);
2536                    }
2537
2538                    // Since DW_TAG_structure_type gets used for both classes
2539                    // and structures, we may need to set any DW_TAG_member
2540                    // fields to have a "private" access if none was specified.
2541                    // When we parsed the child members we tracked that actual
2542                    // accessibility value for each DW_TAG_member in the
2543                    // "member_accessibilities" array. If the value for the
2544                    // member is zero, then it was set to the "default_accessibility"
2545                    // which for structs was "public". Below we correct this
2546                    // by setting any fields to "private" that weren't correctly
2547                    // set.
2548                    if (is_a_class && !member_accessibilities.empty())
2549                    {
2550                        // This is a class and all members that didn't have
2551                        // their access specified are private.
2552                        clang_type.SetDefaultAccessForRecordFields (eAccessPrivate,
2553                                                                    &member_accessibilities.front(),
2554                                                                    member_accessibilities.size());
2555                    }
2556
2557                    if (!base_classes.empty())
2558                    {
2559                        // Make sure all base classes refer to complete types and not
2560                        // forward declarations. If we don't do this, clang will crash
2561                        // with an assertion in the call to clang_type.SetBaseClassesForClassType()
2562                        bool base_class_error = false;
2563                        for (auto &base_class : base_classes)
2564                        {
2565                            clang::TypeSourceInfo *type_source_info = base_class->getTypeSourceInfo();
2566                            if (type_source_info)
2567                            {
2568                                ClangASTType base_class_type (GetClangASTContext().getASTContext(), type_source_info->getType());
2569                                if (base_class_type.GetCompleteType() == false)
2570                                {
2571                                    if (!base_class_error)
2572                                    {
2573                                        GetObjectFile()->GetModule()->ReportError ("DWARF DIE at 0x%8.8x for class '%s' has a base class '%s' that is a forward declaration, not a complete definition.\nPlease file a bug against the compiler and include the preprocessed output for %s",
2574                                                                                   die->GetOffset(),
2575                                                                                   die->GetName(this, dwarf_cu),
2576                                                                                   base_class_type.GetTypeName().GetCString(),
2577                                                                                   sc.comp_unit ? sc.comp_unit->GetPath().c_str() : "the source file");
2578                                    }
2579                                    // We have no choice other than to pretend that the base class
2580                                    // is complete. If we don't do this, clang will crash when we
2581                                    // call setBases() inside of "clang_type.SetBaseClassesForClassType()"
2582                                    // below. Since we provide layout assistance, all ivars in this
2583                                    // class and other classe will be fine, this is the best we can do
2584                                    // short of crashing.
2585                                    base_class_type.StartTagDeclarationDefinition ();
2586                                    base_class_type.CompleteTagDeclarationDefinition ();
2587                                }
2588                            }
2589                        }
2590                        clang_type.SetBaseClassesForClassType (&base_classes.front(),
2591                                                               base_classes.size());
2592
2593                        // Clang will copy each CXXBaseSpecifier in "base_classes"
2594                        // so we have to free them all.
2595                        ClangASTType::DeleteBaseClassSpecifiers (&base_classes.front(),
2596                                                                 base_classes.size());
2597                    }
2598                }
2599            }
2600
2601            clang_type.BuildIndirectFields ();
2602            clang_type.CompleteTagDeclarationDefinition ();
2603
2604            if (!layout_info.field_offsets.empty() ||
2605                !layout_info.base_offsets.empty()  ||
2606                !layout_info.vbase_offsets.empty() )
2607            {
2608                if (type)
2609                    layout_info.bit_size = type->GetByteSize() * 8;
2610                if (layout_info.bit_size == 0)
2611                    layout_info.bit_size = die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_byte_size, 0) * 8;
2612
2613                clang::CXXRecordDecl *record_decl = clang_type.GetAsCXXRecordDecl();
2614                if (record_decl)
2615                {
2616                    if (log)
2617                    {
2618                        GetObjectFile()->GetModule()->LogMessage (log,
2619                                                                  "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) caching layout info for record_decl = %p, bit_size = %" PRIu64 ", alignment = %" PRIu64 ", field_offsets[%u], base_offsets[%u], vbase_offsets[%u])",
2620                                                                  clang_type.GetOpaqueQualType(),
2621                                                                  record_decl,
2622                                                                  layout_info.bit_size,
2623                                                                  layout_info.alignment,
2624                                                                  (uint32_t)layout_info.field_offsets.size(),
2625                                                                  (uint32_t)layout_info.base_offsets.size(),
2626                                                                  (uint32_t)layout_info.vbase_offsets.size());
2627
2628                        uint32_t idx;
2629                        {
2630                        llvm::DenseMap <const clang::FieldDecl *, uint64_t>::const_iterator pos, end = layout_info.field_offsets.end();
2631                        for (idx = 0, pos = layout_info.field_offsets.begin(); pos != end; ++pos, ++idx)
2632                        {
2633                            GetObjectFile()->GetModule()->LogMessage (log,
2634                                                                      "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) field[%u] = { bit_offset=%u, name='%s' }",
2635                                                                      clang_type.GetOpaqueQualType(),
2636                                                                      idx,
2637                                                                      (uint32_t)pos->second,
2638                                                                      pos->first->getNameAsString().c_str());
2639                        }
2640                        }
2641
2642                        {
2643                        llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits>::const_iterator base_pos, base_end = layout_info.base_offsets.end();
2644                        for (idx = 0, base_pos = layout_info.base_offsets.begin(); base_pos != base_end; ++base_pos, ++idx)
2645                        {
2646                            GetObjectFile()->GetModule()->LogMessage (log,
2647                                                                      "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) base[%u] = { byte_offset=%u, name='%s' }",
2648                                                                      clang_type.GetOpaqueQualType(),
2649                                                                      idx,
2650                                                                      (uint32_t)base_pos->second.getQuantity(),
2651                                                                      base_pos->first->getNameAsString().c_str());
2652                        }
2653                        }
2654                        {
2655                        llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits>::const_iterator vbase_pos, vbase_end = layout_info.vbase_offsets.end();
2656                        for (idx = 0, vbase_pos = layout_info.vbase_offsets.begin(); vbase_pos != vbase_end; ++vbase_pos, ++idx)
2657                        {
2658                            GetObjectFile()->GetModule()->LogMessage (log,
2659                                                                      "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) vbase[%u] = { byte_offset=%u, name='%s' }",
2660                                                                      clang_type.GetOpaqueQualType(),
2661                                                                      idx,
2662                                                                      (uint32_t)vbase_pos->second.getQuantity(),
2663                                                                      vbase_pos->first->getNameAsString().c_str());
2664                        }
2665                        }
2666                    }
2667                    m_record_decl_to_layout_map.insert(std::make_pair(record_decl, layout_info));
2668                }
2669            }
2670        }
2671
2672        return (bool)clang_type;
2673
2674    case DW_TAG_enumeration_type:
2675        clang_type.StartTagDeclarationDefinition ();
2676        if (die->HasChildren())
2677        {
2678            SymbolContext sc(GetCompUnitForDWARFCompUnit(dwarf_cu));
2679            bool is_signed = false;
2680            clang_type.IsIntegerType(is_signed);
2681            ParseChildEnumerators(sc, clang_type, is_signed, type->GetByteSize(), dwarf_cu, die);
2682        }
2683        clang_type.CompleteTagDeclarationDefinition ();
2684        return (bool)clang_type;
2685
2686    default:
2687        assert(false && "not a forward clang type decl!");
2688        break;
2689    }
2690    return false;
2691}
2692
2693Type*
2694SymbolFileDWARF::ResolveType (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* type_die, bool assert_not_being_parsed)
2695{
2696    if (type_die != NULL)
2697    {
2698        Type *type = m_die_to_type.lookup (type_die);
2699
2700        if (type == NULL)
2701            type = GetTypeForDIE (dwarf_cu, type_die).get();
2702
2703        if (assert_not_being_parsed)
2704        {
2705            if (type != DIE_IS_BEING_PARSED)
2706                return type;
2707
2708            GetObjectFile()->GetModule()->ReportError ("Parsing a die that is being parsed die: 0x%8.8x: %s %s",
2709                                                       type_die->GetOffset(),
2710                                                       DW_TAG_value_to_name(type_die->Tag()),
2711                                                       type_die->GetName(this, dwarf_cu));
2712
2713        }
2714        else
2715            return type;
2716    }
2717    return NULL;
2718}
2719
2720CompileUnit*
2721SymbolFileDWARF::GetCompUnitForDWARFCompUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx)
2722{
2723    // Check if the symbol vendor already knows about this compile unit?
2724    if (dwarf_cu->GetUserData() == NULL)
2725    {
2726        // The symbol vendor doesn't know about this compile unit, we
2727        // need to parse and add it to the symbol vendor object.
2728        return ParseCompileUnit(dwarf_cu, cu_idx).get();
2729    }
2730    return (CompileUnit*)dwarf_cu->GetUserData();
2731}
2732
2733bool
2734SymbolFileDWARF::GetFunction (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* func_die, SymbolContext& sc)
2735{
2736    sc.Clear(false);
2737    // Check if the symbol vendor already knows about this compile unit?
2738    sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX);
2739
2740    sc.function = sc.comp_unit->FindFunctionByUID (MakeUserID(func_die->GetOffset())).get();
2741    if (sc.function == NULL)
2742        sc.function = ParseCompileUnitFunction(sc, dwarf_cu, func_die);
2743
2744    if (sc.function)
2745    {
2746        sc.module_sp = sc.function->CalculateSymbolContextModule();
2747        return true;
2748    }
2749
2750    return false;
2751}
2752
2753uint32_t
2754SymbolFileDWARF::ResolveSymbolContext (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc)
2755{
2756    Timer scoped_timer(__PRETTY_FUNCTION__,
2757                       "SymbolFileDWARF::ResolveSymbolContext (so_addr = { section = %p, offset = 0x%" PRIx64 " }, resolve_scope = 0x%8.8x)",
2758                       so_addr.GetSection().get(),
2759                       so_addr.GetOffset(),
2760                       resolve_scope);
2761    uint32_t resolved = 0;
2762    if (resolve_scope & (   eSymbolContextCompUnit |
2763                            eSymbolContextFunction |
2764                            eSymbolContextBlock |
2765                            eSymbolContextLineEntry))
2766    {
2767        lldb::addr_t file_vm_addr = so_addr.GetFileAddress();
2768
2769        DWARFDebugInfo* debug_info = DebugInfo();
2770        if (debug_info)
2771        {
2772            const dw_offset_t cu_offset = debug_info->GetCompileUnitAranges().FindAddress(file_vm_addr);
2773            if (cu_offset != DW_INVALID_OFFSET)
2774            {
2775                uint32_t cu_idx = DW_INVALID_INDEX;
2776                DWARFCompileUnit* dwarf_cu = debug_info->GetCompileUnit(cu_offset, &cu_idx).get();
2777                if (dwarf_cu)
2778                {
2779                    sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx);
2780                    if (sc.comp_unit)
2781                    {
2782                        resolved |= eSymbolContextCompUnit;
2783
2784                        bool force_check_line_table = false;
2785                        if (resolve_scope & (eSymbolContextFunction | eSymbolContextBlock))
2786                        {
2787                            DWARFDebugInfoEntry *function_die = NULL;
2788                            DWARFDebugInfoEntry *block_die = NULL;
2789                            if (resolve_scope & eSymbolContextBlock)
2790                            {
2791                                dwarf_cu->LookupAddress(file_vm_addr, &function_die, &block_die);
2792                            }
2793                            else
2794                            {
2795                                dwarf_cu->LookupAddress(file_vm_addr, &function_die, NULL);
2796                            }
2797
2798                            if (function_die != NULL)
2799                            {
2800                                sc.function = sc.comp_unit->FindFunctionByUID (MakeUserID(function_die->GetOffset())).get();
2801                                if (sc.function == NULL)
2802                                    sc.function = ParseCompileUnitFunction(sc, dwarf_cu, function_die);
2803                            }
2804                            else
2805                            {
2806                                // We might have had a compile unit that had discontiguous
2807                                // address ranges where the gaps are symbols that don't have
2808                                // any debug info. Discontiguous compile unit address ranges
2809                                // should only happen when there aren't other functions from
2810                                // other compile units in these gaps. This helps keep the size
2811                                // of the aranges down.
2812                                force_check_line_table = true;
2813                            }
2814
2815                            if (sc.function != NULL)
2816                            {
2817                                resolved |= eSymbolContextFunction;
2818
2819                                if (resolve_scope & eSymbolContextBlock)
2820                                {
2821                                    Block& block = sc.function->GetBlock (true);
2822
2823                                    if (block_die != NULL)
2824                                        sc.block = block.FindBlockByID (MakeUserID(block_die->GetOffset()));
2825                                    else
2826                                        sc.block = block.FindBlockByID (MakeUserID(function_die->GetOffset()));
2827                                    if (sc.block)
2828                                        resolved |= eSymbolContextBlock;
2829                                }
2830                            }
2831                        }
2832
2833                        if ((resolve_scope & eSymbolContextLineEntry) || force_check_line_table)
2834                        {
2835                            LineTable *line_table = sc.comp_unit->GetLineTable();
2836                            if (line_table != NULL)
2837                            {
2838                                // And address that makes it into this function should be in terms
2839                                // of this debug file if there is no debug map, or it will be an
2840                                // address in the .o file which needs to be fixed up to be in terms
2841                                // of the debug map executable. Either way, calling FixupAddress()
2842                                // will work for us.
2843                                Address exe_so_addr (so_addr);
2844                                if (FixupAddress(exe_so_addr))
2845                                {
2846                                    if (line_table->FindLineEntryByAddress (exe_so_addr, sc.line_entry))
2847                                    {
2848                                        resolved |= eSymbolContextLineEntry;
2849                                    }
2850                                }
2851                            }
2852                        }
2853
2854                        if (force_check_line_table && !(resolved & eSymbolContextLineEntry))
2855                        {
2856                            // We might have had a compile unit that had discontiguous
2857                            // address ranges where the gaps are symbols that don't have
2858                            // any debug info. Discontiguous compile unit address ranges
2859                            // should only happen when there aren't other functions from
2860                            // other compile units in these gaps. This helps keep the size
2861                            // of the aranges down.
2862                            sc.comp_unit = NULL;
2863                            resolved &= ~eSymbolContextCompUnit;
2864                        }
2865                    }
2866                    else
2867                    {
2868                        GetObjectFile()->GetModule()->ReportWarning ("0x%8.8x: compile unit %u failed to create a valid lldb_private::CompileUnit class.",
2869                                                                     cu_offset,
2870                                                                     cu_idx);
2871                    }
2872                }
2873            }
2874        }
2875    }
2876    return resolved;
2877}
2878
2879
2880
2881uint32_t
2882SymbolFileDWARF::ResolveSymbolContext(const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
2883{
2884    const uint32_t prev_size = sc_list.GetSize();
2885    if (resolve_scope & eSymbolContextCompUnit)
2886    {
2887        DWARFDebugInfo* debug_info = DebugInfo();
2888        if (debug_info)
2889        {
2890            uint32_t cu_idx;
2891            DWARFCompileUnit* dwarf_cu = NULL;
2892
2893            for (cu_idx = 0; (dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx)) != NULL; ++cu_idx)
2894            {
2895                CompileUnit *dc_cu = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx);
2896                const bool full_match = (bool)file_spec.GetDirectory();
2897                bool file_spec_matches_cu_file_spec = dc_cu != NULL && FileSpec::Equal(file_spec, *dc_cu, full_match);
2898                if (check_inlines || file_spec_matches_cu_file_spec)
2899                {
2900                    SymbolContext sc (m_obj_file->GetModule());
2901                    sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx);
2902                    if (sc.comp_unit)
2903                    {
2904                        uint32_t file_idx = UINT32_MAX;
2905
2906                        // If we are looking for inline functions only and we don't
2907                        // find it in the support files, we are done.
2908                        if (check_inlines)
2909                        {
2910                            file_idx = sc.comp_unit->GetSupportFiles().FindFileIndex (1, file_spec, true);
2911                            if (file_idx == UINT32_MAX)
2912                                continue;
2913                        }
2914
2915                        if (line != 0)
2916                        {
2917                            LineTable *line_table = sc.comp_unit->GetLineTable();
2918
2919                            if (line_table != NULL && line != 0)
2920                            {
2921                                // We will have already looked up the file index if
2922                                // we are searching for inline entries.
2923                                if (!check_inlines)
2924                                    file_idx = sc.comp_unit->GetSupportFiles().FindFileIndex (1, file_spec, true);
2925
2926                                if (file_idx != UINT32_MAX)
2927                                {
2928                                    uint32_t found_line;
2929                                    uint32_t line_idx = line_table->FindLineEntryIndexByFileIndex (0, file_idx, line, false, &sc.line_entry);
2930                                    found_line = sc.line_entry.line;
2931
2932                                    while (line_idx != UINT32_MAX)
2933                                    {
2934                                        sc.function = NULL;
2935                                        sc.block = NULL;
2936                                        if (resolve_scope & (eSymbolContextFunction | eSymbolContextBlock))
2937                                        {
2938                                            const lldb::addr_t file_vm_addr = sc.line_entry.range.GetBaseAddress().GetFileAddress();
2939                                            if (file_vm_addr != LLDB_INVALID_ADDRESS)
2940                                            {
2941                                                DWARFDebugInfoEntry *function_die = NULL;
2942                                                DWARFDebugInfoEntry *block_die = NULL;
2943                                                dwarf_cu->LookupAddress(file_vm_addr, &function_die, resolve_scope & eSymbolContextBlock ? &block_die : NULL);
2944
2945                                                if (function_die != NULL)
2946                                                {
2947                                                    sc.function = sc.comp_unit->FindFunctionByUID (MakeUserID(function_die->GetOffset())).get();
2948                                                    if (sc.function == NULL)
2949                                                        sc.function = ParseCompileUnitFunction(sc, dwarf_cu, function_die);
2950                                                }
2951
2952                                                if (sc.function != NULL)
2953                                                {
2954                                                    Block& block = sc.function->GetBlock (true);
2955
2956                                                    if (block_die != NULL)
2957                                                        sc.block = block.FindBlockByID (MakeUserID(block_die->GetOffset()));
2958                                                    else
2959                                                        sc.block = block.FindBlockByID (MakeUserID(function_die->GetOffset()));
2960                                                }
2961                                            }
2962                                        }
2963
2964                                        sc_list.Append(sc);
2965                                        line_idx = line_table->FindLineEntryIndexByFileIndex (line_idx + 1, file_idx, found_line, true, &sc.line_entry);
2966                                    }
2967                                }
2968                            }
2969                            else if (file_spec_matches_cu_file_spec && !check_inlines)
2970                            {
2971                                // only append the context if we aren't looking for inline call sites
2972                                // by file and line and if the file spec matches that of the compile unit
2973                                sc_list.Append(sc);
2974                            }
2975                        }
2976                        else if (file_spec_matches_cu_file_spec && !check_inlines)
2977                        {
2978                            // only append the context if we aren't looking for inline call sites
2979                            // by file and line and if the file spec matches that of the compile unit
2980                            sc_list.Append(sc);
2981                        }
2982
2983                        if (!check_inlines)
2984                            break;
2985                    }
2986                }
2987            }
2988        }
2989    }
2990    return sc_list.GetSize() - prev_size;
2991}
2992
2993void
2994SymbolFileDWARF::Index ()
2995{
2996    if (m_indexed)
2997        return;
2998    m_indexed = true;
2999    Timer scoped_timer (__PRETTY_FUNCTION__,
3000                        "SymbolFileDWARF::Index (%s)",
3001                        GetObjectFile()->GetFileSpec().GetFilename().AsCString());
3002
3003    DWARFDebugInfo* debug_info = DebugInfo();
3004    if (debug_info)
3005    {
3006        uint32_t cu_idx = 0;
3007        const uint32_t num_compile_units = GetNumCompileUnits();
3008        for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
3009        {
3010            DWARFCompileUnit* dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx);
3011
3012            bool clear_dies = dwarf_cu->ExtractDIEsIfNeeded (false) > 1;
3013
3014            dwarf_cu->Index (cu_idx,
3015                             m_function_basename_index,
3016                             m_function_fullname_index,
3017                             m_function_method_index,
3018                             m_function_selector_index,
3019                             m_objc_class_selectors_index,
3020                             m_global_index,
3021                             m_type_index,
3022                             m_namespace_index);
3023
3024            // Keep memory down by clearing DIEs if this generate function
3025            // caused them to be parsed
3026            if (clear_dies)
3027                dwarf_cu->ClearDIEs (true);
3028        }
3029
3030        m_function_basename_index.Finalize();
3031        m_function_fullname_index.Finalize();
3032        m_function_method_index.Finalize();
3033        m_function_selector_index.Finalize();
3034        m_objc_class_selectors_index.Finalize();
3035        m_global_index.Finalize();
3036        m_type_index.Finalize();
3037        m_namespace_index.Finalize();
3038
3039#if defined (ENABLE_DEBUG_PRINTF)
3040        StreamFile s(stdout, false);
3041        s.Printf ("DWARF index for '%s':",
3042                  GetObjectFile()->GetFileSpec().GetPath().c_str());
3043        s.Printf("\nFunction basenames:\n");    m_function_basename_index.Dump (&s);
3044        s.Printf("\nFunction fullnames:\n");    m_function_fullname_index.Dump (&s);
3045        s.Printf("\nFunction methods:\n");      m_function_method_index.Dump (&s);
3046        s.Printf("\nFunction selectors:\n");    m_function_selector_index.Dump (&s);
3047        s.Printf("\nObjective C class selectors:\n");    m_objc_class_selectors_index.Dump (&s);
3048        s.Printf("\nGlobals and statics:\n");   m_global_index.Dump (&s);
3049        s.Printf("\nTypes:\n");                 m_type_index.Dump (&s);
3050        s.Printf("\nNamepaces:\n");             m_namespace_index.Dump (&s);
3051#endif
3052    }
3053}
3054
3055bool
3056SymbolFileDWARF::NamespaceDeclMatchesThisSymbolFile (const ClangNamespaceDecl *namespace_decl)
3057{
3058    if (namespace_decl == NULL)
3059    {
3060        // Invalid namespace decl which means we aren't matching only things
3061        // in this symbol file, so return true to indicate it matches this
3062        // symbol file.
3063        return true;
3064    }
3065
3066    clang::ASTContext *namespace_ast = namespace_decl->GetASTContext();
3067
3068    if (namespace_ast == NULL)
3069        return true;    // No AST in the "namespace_decl", return true since it
3070                        // could then match any symbol file, including this one
3071
3072    if (namespace_ast == GetClangASTContext().getASTContext())
3073        return true;    // The ASTs match, return true
3074
3075    // The namespace AST was valid, and it does not match...
3076    Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
3077
3078    if (log)
3079        GetObjectFile()->GetModule()->LogMessage(log, "Valid namespace does not match symbol file");
3080
3081    return false;
3082}
3083
3084bool
3085SymbolFileDWARF::DIEIsInNamespace (const ClangNamespaceDecl *namespace_decl,
3086                                   DWARFCompileUnit* cu,
3087                                   const DWARFDebugInfoEntry* die)
3088{
3089    // No namespace specified, so the answesr i
3090    if (namespace_decl == NULL)
3091        return true;
3092
3093    Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
3094
3095    const DWARFDebugInfoEntry *decl_ctx_die = NULL;
3096    clang::DeclContext *die_clang_decl_ctx = GetClangDeclContextContainingDIE (cu, die, &decl_ctx_die);
3097    if (decl_ctx_die)
3098    {
3099        clang::NamespaceDecl *clang_namespace_decl = namespace_decl->GetNamespaceDecl();
3100
3101        if (clang_namespace_decl)
3102        {
3103            if (decl_ctx_die->Tag() != DW_TAG_namespace)
3104            {
3105                if (log)
3106                    GetObjectFile()->GetModule()->LogMessage(log, "Found a match, but its parent is not a namespace");
3107                return false;
3108            }
3109
3110            if (clang_namespace_decl == die_clang_decl_ctx)
3111                return true;
3112            else
3113                return false;
3114        }
3115        else
3116        {
3117            // We have a namespace_decl that was not NULL but it contained
3118            // a NULL "clang::NamespaceDecl", so this means the global namespace
3119            // So as long the the contained decl context DIE isn't a namespace
3120            // we should be ok.
3121            if (decl_ctx_die->Tag() != DW_TAG_namespace)
3122                return true;
3123        }
3124    }
3125
3126    if (log)
3127        GetObjectFile()->GetModule()->LogMessage(log, "Found a match, but its parent doesn't exist");
3128
3129    return false;
3130}
3131uint32_t
3132SymbolFileDWARF::FindGlobalVariables (const ConstString &name, const lldb_private::ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables)
3133{
3134    Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
3135
3136    if (log)
3137    {
3138        GetObjectFile()->GetModule()->LogMessage (log,
3139                                                  "SymbolFileDWARF::FindGlobalVariables (name=\"%s\", namespace_decl=%p, append=%u, max_matches=%u, variables)",
3140                                                  name.GetCString(),
3141                                                  namespace_decl,
3142                                                  append,
3143                                                  max_matches);
3144    }
3145
3146    if (!NamespaceDeclMatchesThisSymbolFile(namespace_decl))
3147        return 0;
3148
3149    DWARFDebugInfo* info = DebugInfo();
3150    if (info == NULL)
3151        return 0;
3152
3153    // If we aren't appending the results to this list, then clear the list
3154    if (!append)
3155        variables.Clear();
3156
3157    // Remember how many variables are in the list before we search in case
3158    // we are appending the results to a variable list.
3159    const uint32_t original_size = variables.GetSize();
3160
3161    DIEArray die_offsets;
3162
3163    if (m_using_apple_tables)
3164    {
3165        if (m_apple_names_ap.get())
3166        {
3167            const char *name_cstr = name.GetCString();
3168            const char *base_name_start;
3169            const char *base_name_end = NULL;
3170
3171            if (!CPPLanguageRuntime::StripNamespacesFromVariableName(name_cstr, base_name_start, base_name_end))
3172                base_name_start = name_cstr;
3173
3174            m_apple_names_ap->FindByName (base_name_start, die_offsets);
3175        }
3176    }
3177    else
3178    {
3179        // Index the DWARF if we haven't already
3180        if (!m_indexed)
3181            Index ();
3182
3183        m_global_index.Find (name, die_offsets);
3184    }
3185
3186    const size_t num_die_matches = die_offsets.size();
3187    if (num_die_matches)
3188    {
3189        SymbolContext sc;
3190        sc.module_sp = m_obj_file->GetModule();
3191        assert (sc.module_sp);
3192
3193        DWARFDebugInfo* debug_info = DebugInfo();
3194        DWARFCompileUnit* dwarf_cu = NULL;
3195        const DWARFDebugInfoEntry* die = NULL;
3196        bool done = false;
3197        for (size_t i=0; i<num_die_matches && !done; ++i)
3198        {
3199            const dw_offset_t die_offset = die_offsets[i];
3200            die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);
3201
3202            if (die)
3203            {
3204                switch (die->Tag())
3205                {
3206                    default:
3207                    case DW_TAG_subprogram:
3208                    case DW_TAG_inlined_subroutine:
3209                    case DW_TAG_try_block:
3210                    case DW_TAG_catch_block:
3211                        break;
3212
3213                    case DW_TAG_variable:
3214                        {
3215                            sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX);
3216
3217                            if (namespace_decl && !DIEIsInNamespace (namespace_decl, dwarf_cu, die))
3218                                continue;
3219
3220                            ParseVariables(sc, dwarf_cu, LLDB_INVALID_ADDRESS, die, false, false, &variables);
3221
3222                            if (variables.GetSize() - original_size >= max_matches)
3223                                done = true;
3224                        }
3225                        break;
3226                }
3227            }
3228            else
3229            {
3230                if (m_using_apple_tables)
3231                {
3232                    GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')\n",
3233                                                                               die_offset, name.GetCString());
3234                }
3235            }
3236        }
3237    }
3238
3239    // Return the number of variable that were appended to the list
3240    const uint32_t num_matches = variables.GetSize() - original_size;
3241    if (log && num_matches > 0)
3242    {
3243        GetObjectFile()->GetModule()->LogMessage (log,
3244                                                  "SymbolFileDWARF::FindGlobalVariables (name=\"%s\", namespace_decl=%p, append=%u, max_matches=%u, variables) => %u",
3245                                                  name.GetCString(),
3246                                                  namespace_decl,
3247                                                  append,
3248                                                  max_matches,
3249                                                  num_matches);
3250    }
3251    return num_matches;
3252}
3253
3254uint32_t
3255SymbolFileDWARF::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
3256{
3257    Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
3258
3259    if (log)
3260    {
3261        GetObjectFile()->GetModule()->LogMessage (log,
3262                                                  "SymbolFileDWARF::FindGlobalVariables (regex=\"%s\", append=%u, max_matches=%u, variables)",
3263                                                  regex.GetText(),
3264                                                  append,
3265                                                  max_matches);
3266    }
3267
3268    DWARFDebugInfo* info = DebugInfo();
3269    if (info == NULL)
3270        return 0;
3271
3272    // If we aren't appending the results to this list, then clear the list
3273    if (!append)
3274        variables.Clear();
3275
3276    // Remember how many variables are in the list before we search in case
3277    // we are appending the results to a variable list.
3278    const uint32_t original_size = variables.GetSize();
3279
3280    DIEArray die_offsets;
3281
3282    if (m_using_apple_tables)
3283    {
3284        if (m_apple_names_ap.get())
3285        {
3286            DWARFMappedHash::DIEInfoArray hash_data_array;
3287            if (m_apple_names_ap->AppendAllDIEsThatMatchingRegex (regex, hash_data_array))
3288                DWARFMappedHash::ExtractDIEArray (hash_data_array, die_offsets);
3289        }
3290    }
3291    else
3292    {
3293        // Index the DWARF if we haven't already
3294        if (!m_indexed)
3295            Index ();
3296
3297        m_global_index.Find (regex, die_offsets);
3298    }
3299
3300    SymbolContext sc;
3301    sc.module_sp = m_obj_file->GetModule();
3302    assert (sc.module_sp);
3303
3304    DWARFCompileUnit* dwarf_cu = NULL;
3305    const DWARFDebugInfoEntry* die = NULL;
3306    const size_t num_matches = die_offsets.size();
3307    if (num_matches)
3308    {
3309        DWARFDebugInfo* debug_info = DebugInfo();
3310        for (size_t i=0; i<num_matches; ++i)
3311        {
3312            const dw_offset_t die_offset = die_offsets[i];
3313            die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);
3314
3315            if (die)
3316            {
3317                sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX);
3318
3319                ParseVariables(sc, dwarf_cu, LLDB_INVALID_ADDRESS, die, false, false, &variables);
3320
3321                if (variables.GetSize() - original_size >= max_matches)
3322                    break;
3323            }
3324            else
3325            {
3326                if (m_using_apple_tables)
3327                {
3328                    GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for regex '%s')\n",
3329                                                                               die_offset, regex.GetText());
3330                }
3331            }
3332        }
3333    }
3334
3335    // Return the number of variable that were appended to the list
3336    return variables.GetSize() - original_size;
3337}
3338
3339
3340bool
3341SymbolFileDWARF::ResolveFunction (dw_offset_t die_offset,
3342                                  DWARFCompileUnit *&dwarf_cu,
3343                                  SymbolContextList& sc_list)
3344{
3345    const DWARFDebugInfoEntry *die = DebugInfo()->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);
3346    return ResolveFunction (dwarf_cu, die, sc_list);
3347}
3348
3349
3350bool
3351SymbolFileDWARF::ResolveFunction (DWARFCompileUnit *cu,
3352                                  const DWARFDebugInfoEntry *die,
3353                                  SymbolContextList& sc_list)
3354{
3355    SymbolContext sc;
3356
3357    if (die == NULL)
3358        return false;
3359
3360    // If we were passed a die that is not a function, just return false...
3361    if (die->Tag() != DW_TAG_subprogram && die->Tag() != DW_TAG_inlined_subroutine)
3362        return false;
3363
3364    const DWARFDebugInfoEntry* inlined_die = NULL;
3365    if (die->Tag() == DW_TAG_inlined_subroutine)
3366    {
3367        inlined_die = die;
3368
3369        while ((die = die->GetParent()) != NULL)
3370        {
3371            if (die->Tag() == DW_TAG_subprogram)
3372                break;
3373        }
3374    }
3375    assert (die->Tag() == DW_TAG_subprogram);
3376    if (GetFunction (cu, die, sc))
3377    {
3378        Address addr;
3379        // Parse all blocks if needed
3380        if (inlined_die)
3381        {
3382            sc.block = sc.function->GetBlock (true).FindBlockByID (MakeUserID(inlined_die->GetOffset()));
3383            assert (sc.block != NULL);
3384            if (sc.block->GetStartAddress (addr) == false)
3385                addr.Clear();
3386        }
3387        else
3388        {
3389            sc.block = NULL;
3390            addr = sc.function->GetAddressRange().GetBaseAddress();
3391        }
3392
3393        if (addr.IsValid())
3394        {
3395            sc_list.Append(sc);
3396            return true;
3397        }
3398    }
3399
3400    return false;
3401}
3402
3403void
3404SymbolFileDWARF::FindFunctions (const ConstString &name,
3405                                const NameToDIE &name_to_die,
3406                                SymbolContextList& sc_list)
3407{
3408    DIEArray die_offsets;
3409    if (name_to_die.Find (name, die_offsets))
3410    {
3411        ParseFunctions (die_offsets, sc_list);
3412    }
3413}
3414
3415
3416void
3417SymbolFileDWARF::FindFunctions (const RegularExpression &regex,
3418                                const NameToDIE &name_to_die,
3419                                SymbolContextList& sc_list)
3420{
3421    DIEArray die_offsets;
3422    if (name_to_die.Find (regex, die_offsets))
3423    {
3424        ParseFunctions (die_offsets, sc_list);
3425    }
3426}
3427
3428
3429void
3430SymbolFileDWARF::FindFunctions (const RegularExpression &regex,
3431                                const DWARFMappedHash::MemoryTable &memory_table,
3432                                SymbolContextList& sc_list)
3433{
3434    DIEArray die_offsets;
3435    DWARFMappedHash::DIEInfoArray hash_data_array;
3436    if (memory_table.AppendAllDIEsThatMatchingRegex (regex, hash_data_array))
3437    {
3438        DWARFMappedHash::ExtractDIEArray (hash_data_array, die_offsets);
3439        ParseFunctions (die_offsets, sc_list);
3440    }
3441}
3442
3443void
3444SymbolFileDWARF::ParseFunctions (const DIEArray &die_offsets,
3445                                 SymbolContextList& sc_list)
3446{
3447    const size_t num_matches = die_offsets.size();
3448    if (num_matches)
3449    {
3450        SymbolContext sc;
3451
3452        DWARFCompileUnit* dwarf_cu = NULL;
3453        for (size_t i=0; i<num_matches; ++i)
3454        {
3455            const dw_offset_t die_offset = die_offsets[i];
3456            ResolveFunction (die_offset, dwarf_cu, sc_list);
3457        }
3458    }
3459}
3460
3461bool
3462SymbolFileDWARF::FunctionDieMatchesPartialName (const DWARFDebugInfoEntry* die,
3463                                                const DWARFCompileUnit *dwarf_cu,
3464                                                uint32_t name_type_mask,
3465                                                const char *partial_name,
3466                                                const char *base_name_start,
3467                                                const char *base_name_end)
3468{
3469    // If we are looking only for methods, throw away all the ones that are or aren't in C++ classes:
3470    if (name_type_mask == eFunctionNameTypeMethod || name_type_mask == eFunctionNameTypeBase)
3471    {
3472        clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIEOffset(die->GetOffset());
3473        if (!containing_decl_ctx)
3474            return false;
3475
3476        bool is_cxx_method = DeclKindIsCXXClass(containing_decl_ctx->getDeclKind());
3477
3478        if (name_type_mask == eFunctionNameTypeMethod)
3479        {
3480            if (is_cxx_method == false)
3481                return false;
3482        }
3483
3484        if (name_type_mask == eFunctionNameTypeBase)
3485        {
3486            if (is_cxx_method == true)
3487                return false;
3488        }
3489    }
3490
3491    // Now we need to check whether the name we got back for this type matches the extra specifications
3492    // that were in the name we're looking up:
3493    if (base_name_start != partial_name || *base_name_end != '\0')
3494    {
3495        // First see if the stuff to the left matches the full name.  To do that let's see if
3496        // we can pull out the mips linkage name attribute:
3497
3498        Mangled best_name;
3499        DWARFDebugInfoEntry::Attributes attributes;
3500        DWARFFormValue form_value;
3501        die->GetAttributes(this, dwarf_cu, NULL, attributes);
3502        uint32_t idx = attributes.FindAttributeIndex(DW_AT_MIPS_linkage_name);
3503        if (idx == UINT32_MAX)
3504            idx = attributes.FindAttributeIndex(DW_AT_linkage_name);
3505        if (idx != UINT32_MAX)
3506        {
3507            if (attributes.ExtractFormValueAtIndex(this, idx, form_value))
3508            {
3509                const char *mangled_name = form_value.AsCString(&get_debug_str_data());
3510                if (mangled_name)
3511                    best_name.SetValue (ConstString(mangled_name), true);
3512            }
3513        }
3514
3515        if (!best_name)
3516        {
3517            idx = attributes.FindAttributeIndex(DW_AT_name);
3518            if (idx != UINT32_MAX && attributes.ExtractFormValueAtIndex(this, idx, form_value))
3519            {
3520                const char *name = form_value.AsCString(&get_debug_str_data());
3521                best_name.SetValue (ConstString(name), false);
3522            }
3523        }
3524
3525        if (best_name.GetDemangledName())
3526        {
3527            const char *demangled = best_name.GetDemangledName().GetCString();
3528            if (demangled)
3529            {
3530                std::string name_no_parens(partial_name, base_name_end - partial_name);
3531                const char *partial_in_demangled = strstr (demangled, name_no_parens.c_str());
3532                if (partial_in_demangled == NULL)
3533                    return false;
3534                else
3535                {
3536                    // Sort out the case where our name is something like "Process::Destroy" and the match is
3537                    // "SBProcess::Destroy" - that shouldn't be a match.  We should really always match on
3538                    // namespace boundaries...
3539
3540                    if (partial_name[0] == ':'  && partial_name[1] == ':')
3541                    {
3542                        // The partial name was already on a namespace boundary so all matches are good.
3543                        return true;
3544                    }
3545                    else if (partial_in_demangled == demangled)
3546                    {
3547                        // They both start the same, so this is an good match.
3548                        return true;
3549                    }
3550                    else
3551                    {
3552                        if (partial_in_demangled - demangled == 1)
3553                        {
3554                            // Only one character difference, can't be a namespace boundary...
3555                            return false;
3556                        }
3557                        else if (*(partial_in_demangled - 1) == ':' && *(partial_in_demangled - 2) == ':')
3558                        {
3559                            // We are on a namespace boundary, so this is also good.
3560                            return true;
3561                        }
3562                        else
3563                            return false;
3564                    }
3565                }
3566            }
3567        }
3568    }
3569
3570    return true;
3571}
3572
3573uint32_t
3574SymbolFileDWARF::FindFunctions (const ConstString &name,
3575                                const lldb_private::ClangNamespaceDecl *namespace_decl,
3576                                uint32_t name_type_mask,
3577                                bool include_inlines,
3578                                bool append,
3579                                SymbolContextList& sc_list)
3580{
3581    Timer scoped_timer (__PRETTY_FUNCTION__,
3582                        "SymbolFileDWARF::FindFunctions (name = '%s')",
3583                        name.AsCString());
3584
3585    // eFunctionNameTypeAuto should be pre-resolved by a call to Module::PrepareForFunctionNameLookup()
3586    assert ((name_type_mask & eFunctionNameTypeAuto) == 0);
3587
3588    Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
3589
3590    if (log)
3591    {
3592        GetObjectFile()->GetModule()->LogMessage (log,
3593                                                  "SymbolFileDWARF::FindFunctions (name=\"%s\", name_type_mask=0x%x, append=%u, sc_list)",
3594                                                  name.GetCString(),
3595                                                  name_type_mask,
3596                                                  append);
3597    }
3598
3599    // If we aren't appending the results to this list, then clear the list
3600    if (!append)
3601        sc_list.Clear();
3602
3603    if (!NamespaceDeclMatchesThisSymbolFile(namespace_decl))
3604        return 0;
3605
3606    // If name is empty then we won't find anything.
3607    if (name.IsEmpty())
3608        return 0;
3609
3610    // Remember how many sc_list are in the list before we search in case
3611    // we are appending the results to a variable list.
3612
3613    const char *name_cstr = name.GetCString();
3614
3615    const uint32_t original_size = sc_list.GetSize();
3616
3617    DWARFDebugInfo* info = DebugInfo();
3618    if (info == NULL)
3619        return 0;
3620
3621    DWARFCompileUnit *dwarf_cu = NULL;
3622    std::set<const DWARFDebugInfoEntry *> resolved_dies;
3623    if (m_using_apple_tables)
3624    {
3625        if (m_apple_names_ap.get())
3626        {
3627
3628            DIEArray die_offsets;
3629
3630            uint32_t num_matches = 0;
3631
3632            if (name_type_mask & eFunctionNameTypeFull)
3633            {
3634                // If they asked for the full name, match what they typed.  At some point we may
3635                // want to canonicalize this (strip double spaces, etc.  For now, we just add all the
3636                // dies that we find by exact match.
3637                num_matches = m_apple_names_ap->FindByName (name_cstr, die_offsets);
3638                for (uint32_t i = 0; i < num_matches; i++)
3639                {
3640                    const dw_offset_t die_offset = die_offsets[i];
3641                    const DWARFDebugInfoEntry *die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);
3642                    if (die)
3643                    {
3644                        if (namespace_decl && !DIEIsInNamespace (namespace_decl, dwarf_cu, die))
3645                            continue;
3646
3647                        if (!include_inlines && die->Tag() == DW_TAG_inlined_subroutine)
3648                            continue;
3649
3650                        if (resolved_dies.find(die) == resolved_dies.end())
3651                        {
3652                            if (ResolveFunction (dwarf_cu, die, sc_list))
3653                                resolved_dies.insert(die);
3654                        }
3655                    }
3656                    else
3657                    {
3658                        GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')",
3659                                                                                   die_offset, name_cstr);
3660                    }
3661                }
3662            }
3663
3664            if (name_type_mask & eFunctionNameTypeSelector)
3665            {
3666                if (namespace_decl && *namespace_decl)
3667                    return 0; // no selectors in namespaces
3668
3669                num_matches = m_apple_names_ap->FindByName (name_cstr, die_offsets);
3670                // Now make sure these are actually ObjC methods.  In this case we can simply look up the name,
3671                // and if it is an ObjC method name, we're good.
3672
3673                for (uint32_t i = 0; i < num_matches; i++)
3674                {
3675                    const dw_offset_t die_offset = die_offsets[i];
3676                    const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);
3677                    if (die)
3678                    {
3679                        const char *die_name = die->GetName(this, dwarf_cu);
3680                        if (ObjCLanguageRuntime::IsPossibleObjCMethodName(die_name))
3681                        {
3682                            if (!include_inlines && die->Tag() == DW_TAG_inlined_subroutine)
3683                                continue;
3684
3685                            if (resolved_dies.find(die) == resolved_dies.end())
3686                            {
3687                                if (ResolveFunction (dwarf_cu, die, sc_list))
3688                                    resolved_dies.insert(die);
3689                            }
3690                        }
3691                    }
3692                    else
3693                    {
3694                        GetObjectFile()->GetModule()->ReportError ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')",
3695                                                                   die_offset, name_cstr);
3696                    }
3697                }
3698                die_offsets.clear();
3699            }
3700
3701            if (((name_type_mask & eFunctionNameTypeMethod) && !namespace_decl) || name_type_mask & eFunctionNameTypeBase)
3702            {
3703                // The apple_names table stores just the "base name" of C++ methods in the table.  So we have to
3704                // extract the base name, look that up, and if there is any other information in the name we were
3705                // passed in we have to post-filter based on that.
3706
3707                // FIXME: Arrange the logic above so that we don't calculate the base name twice:
3708                num_matches = m_apple_names_ap->FindByName (name_cstr, die_offsets);
3709
3710                for (uint32_t i = 0; i < num_matches; i++)
3711                {
3712                    const dw_offset_t die_offset = die_offsets[i];
3713                    const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);
3714                    if (die)
3715                    {
3716                        if (!include_inlines && die->Tag() == DW_TAG_inlined_subroutine)
3717                            continue;
3718
3719                        if (namespace_decl && !DIEIsInNamespace (namespace_decl, dwarf_cu, die))
3720                            continue;
3721
3722                        // If we get to here, the die is good, and we should add it:
3723                        if (resolved_dies.find(die) == resolved_dies.end())
3724                        if (ResolveFunction (dwarf_cu, die, sc_list))
3725                        {
3726                            bool keep_die = true;
3727                            if ((name_type_mask & (eFunctionNameTypeBase|eFunctionNameTypeMethod)) != (eFunctionNameTypeBase|eFunctionNameTypeMethod))
3728                            {
3729                                // We are looking for either basenames or methods, so we need to
3730                                // trim out the ones we won't want by looking at the type
3731                                SymbolContext sc;
3732                                if (sc_list.GetLastContext(sc))
3733                                {
3734                                    if (sc.block)
3735                                    {
3736                                        // We have an inlined function
3737                                    }
3738                                    else if (sc.function)
3739                                    {
3740                                        Type *type = sc.function->GetType();
3741
3742                                        if (type)
3743                                        {
3744                                            clang::DeclContext* decl_ctx = GetClangDeclContextContainingTypeUID (type->GetID());
3745                                            if (decl_ctx->isRecord())
3746                                            {
3747                                                if (name_type_mask & eFunctionNameTypeBase)
3748                                                {
3749                                                    sc_list.RemoveContextAtIndex(sc_list.GetSize()-1);
3750                                                    keep_die = false;
3751                                                }
3752                                            }
3753                                            else
3754                                            {
3755                                                if (name_type_mask & eFunctionNameTypeMethod)
3756                                                {
3757                                                    sc_list.RemoveContextAtIndex(sc_list.GetSize()-1);
3758                                                    keep_die = false;
3759                                                }
3760                                            }
3761                                        }
3762                                        else
3763                                        {
3764                                            GetObjectFile()->GetModule()->ReportWarning ("function at die offset 0x%8.8x had no function type",
3765                                                                                         die_offset);
3766                                        }
3767                                    }
3768                                }
3769                            }
3770                            if (keep_die)
3771                                resolved_dies.insert(die);
3772                        }
3773                    }
3774                    else
3775                    {
3776                        GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')",
3777                                                                                   die_offset, name_cstr);
3778                    }
3779                }
3780                die_offsets.clear();
3781            }
3782        }
3783    }
3784    else
3785    {
3786
3787        // Index the DWARF if we haven't already
3788        if (!m_indexed)
3789            Index ();
3790
3791        if (name_type_mask & eFunctionNameTypeFull)
3792        {
3793            FindFunctions (name, m_function_fullname_index, sc_list);
3794
3795            // FIXME Temporary workaround for global/anonymous namespace
3796            // functions on FreeBSD and Linux
3797#if defined (__FreeBSD__) || defined (__linux__)
3798            // If we didn't find any functions in the global namespace try
3799            // looking in the basename index but ignore any returned
3800            // functions that have a namespace (ie. mangled names starting with
3801            // '_ZN') but keep functions which have an anonymous namespace
3802            if (sc_list.GetSize() == 0)
3803            {
3804                SymbolContextList temp_sc_list;
3805                FindFunctions (name, m_function_basename_index, temp_sc_list);
3806                if (!namespace_decl)
3807                {
3808                    SymbolContext sc;
3809                    for (uint32_t i = 0; i < temp_sc_list.GetSize(); i++)
3810                    {
3811                        if (temp_sc_list.GetContextAtIndex(i, sc))
3812                        {
3813                            ConstString mangled_name = sc.GetFunctionName(Mangled::ePreferMangled);
3814                            ConstString demangled_name = sc.GetFunctionName(Mangled::ePreferDemangled);
3815                            if (strncmp(mangled_name.GetCString(), "_ZN", 3) ||
3816                                !strncmp(demangled_name.GetCString(), "(anonymous namespace)", 21))
3817                            {
3818                                sc_list.Append(sc);
3819                            }
3820                        }
3821                    }
3822                }
3823            }
3824#endif
3825        }
3826        DIEArray die_offsets;
3827        DWARFCompileUnit *dwarf_cu = NULL;
3828
3829        if (name_type_mask & eFunctionNameTypeBase)
3830        {
3831            uint32_t num_base = m_function_basename_index.Find(name, die_offsets);
3832            for (uint32_t i = 0; i < num_base; i++)
3833            {
3834                const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offsets[i], &dwarf_cu);
3835                if (die)
3836                {
3837                    if (!include_inlines && die->Tag() == DW_TAG_inlined_subroutine)
3838                        continue;
3839
3840                    if (namespace_decl && !DIEIsInNamespace (namespace_decl, dwarf_cu, die))
3841                        continue;
3842
3843                    // If we get to here, the die is good, and we should add it:
3844                    if (resolved_dies.find(die) == resolved_dies.end())
3845                    {
3846                        if (ResolveFunction (dwarf_cu, die, sc_list))
3847                            resolved_dies.insert(die);
3848                    }
3849                }
3850            }
3851            die_offsets.clear();
3852        }
3853
3854        if (name_type_mask & eFunctionNameTypeMethod)
3855        {
3856            if (namespace_decl && *namespace_decl)
3857                return 0; // no methods in namespaces
3858
3859            uint32_t num_base = m_function_method_index.Find(name, die_offsets);
3860            {
3861                for (uint32_t i = 0; i < num_base; i++)
3862                {
3863                    const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offsets[i], &dwarf_cu);
3864                    if (die)
3865                    {
3866                        if (!include_inlines && die->Tag() == DW_TAG_inlined_subroutine)
3867                            continue;
3868
3869                        // If we get to here, the die is good, and we should add it:
3870                        if (resolved_dies.find(die) == resolved_dies.end())
3871                        {
3872                            if (ResolveFunction (dwarf_cu, die, sc_list))
3873                                resolved_dies.insert(die);
3874                        }
3875                    }
3876                }
3877            }
3878            die_offsets.clear();
3879        }
3880
3881        if ((name_type_mask & eFunctionNameTypeSelector) && (!namespace_decl || !*namespace_decl))
3882        {
3883            FindFunctions (name, m_function_selector_index, sc_list);
3884        }
3885
3886    }
3887
3888    // Return the number of variable that were appended to the list
3889    const uint32_t num_matches = sc_list.GetSize() - original_size;
3890
3891    if (log && num_matches > 0)
3892    {
3893        GetObjectFile()->GetModule()->LogMessage (log,
3894                                                  "SymbolFileDWARF::FindFunctions (name=\"%s\", name_type_mask=0x%x, append=%u, sc_list) => %u",
3895                                                  name.GetCString(),
3896                                                  name_type_mask,
3897                                                  append,
3898                                                  num_matches);
3899    }
3900    return num_matches;
3901}
3902
3903uint32_t
3904SymbolFileDWARF::FindFunctions(const RegularExpression& regex, bool include_inlines, bool append, SymbolContextList& sc_list)
3905{
3906    Timer scoped_timer (__PRETTY_FUNCTION__,
3907                        "SymbolFileDWARF::FindFunctions (regex = '%s')",
3908                        regex.GetText());
3909
3910    Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
3911
3912    if (log)
3913    {
3914        GetObjectFile()->GetModule()->LogMessage (log,
3915                                                  "SymbolFileDWARF::FindFunctions (regex=\"%s\", append=%u, sc_list)",
3916                                                  regex.GetText(),
3917                                                  append);
3918    }
3919
3920
3921    // If we aren't appending the results to this list, then clear the list
3922    if (!append)
3923        sc_list.Clear();
3924
3925    // Remember how many sc_list are in the list before we search in case
3926    // we are appending the results to a variable list.
3927    uint32_t original_size = sc_list.GetSize();
3928
3929    if (m_using_apple_tables)
3930    {
3931        if (m_apple_names_ap.get())
3932            FindFunctions (regex, *m_apple_names_ap, sc_list);
3933    }
3934    else
3935    {
3936        // Index the DWARF if we haven't already
3937        if (!m_indexed)
3938            Index ();
3939
3940        FindFunctions (regex, m_function_basename_index, sc_list);
3941
3942        FindFunctions (regex, m_function_fullname_index, sc_list);
3943    }
3944
3945    // Return the number of variable that were appended to the list
3946    return sc_list.GetSize() - original_size;
3947}
3948
3949uint32_t
3950SymbolFileDWARF::FindTypes (const SymbolContext& sc,
3951                            const ConstString &name,
3952                            const lldb_private::ClangNamespaceDecl *namespace_decl,
3953                            bool append,
3954                            uint32_t max_matches,
3955                            TypeList& types)
3956{
3957    DWARFDebugInfo* info = DebugInfo();
3958    if (info == NULL)
3959        return 0;
3960
3961    Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
3962
3963    if (log)
3964    {
3965        if (namespace_decl)
3966        {
3967            GetObjectFile()->GetModule()->LogMessage (log,
3968                                                      "SymbolFileDWARF::FindTypes (sc, name=\"%s\", clang::NamespaceDecl(%p) \"%s\", append=%u, max_matches=%u, type_list)",
3969                                                      name.GetCString(),
3970                                                      namespace_decl->GetNamespaceDecl(),
3971                                                      namespace_decl->GetQualifiedName().c_str(),
3972                                                      append,
3973                                                      max_matches);
3974        }
3975        else
3976        {
3977            GetObjectFile()->GetModule()->LogMessage (log,
3978                                                      "SymbolFileDWARF::FindTypes (sc, name=\"%s\", clang::NamespaceDecl(NULL), append=%u, max_matches=%u, type_list)",
3979                                                      name.GetCString(),
3980                                                      append,
3981                                                      max_matches);
3982        }
3983    }
3984
3985    // If we aren't appending the results to this list, then clear the list
3986    if (!append)
3987        types.Clear();
3988
3989    if (!NamespaceDeclMatchesThisSymbolFile(namespace_decl))
3990        return 0;
3991
3992    DIEArray die_offsets;
3993
3994    if (m_using_apple_tables)
3995    {
3996        if (m_apple_types_ap.get())
3997        {
3998            const char *name_cstr = name.GetCString();
3999            m_apple_types_ap->FindByName (name_cstr, die_offsets);
4000        }
4001    }
4002    else
4003    {
4004        if (!m_indexed)
4005            Index ();
4006
4007        m_type_index.Find (name, die_offsets);
4008    }
4009
4010    const size_t num_die_matches = die_offsets.size();
4011
4012    if (num_die_matches)
4013    {
4014        const uint32_t initial_types_size = types.GetSize();
4015        DWARFCompileUnit* dwarf_cu = NULL;
4016        const DWARFDebugInfoEntry* die = NULL;
4017        DWARFDebugInfo* debug_info = DebugInfo();
4018        for (size_t i=0; i<num_die_matches; ++i)
4019        {
4020            const dw_offset_t die_offset = die_offsets[i];
4021            die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);
4022
4023            if (die)
4024            {
4025                if (namespace_decl && !DIEIsInNamespace (namespace_decl, dwarf_cu, die))
4026                    continue;
4027
4028                Type *matching_type = ResolveType (dwarf_cu, die);
4029                if (matching_type)
4030                {
4031                    // We found a type pointer, now find the shared pointer form our type list
4032                    types.InsertUnique (matching_type->shared_from_this());
4033                    if (types.GetSize() >= max_matches)
4034                        break;
4035                }
4036            }
4037            else
4038            {
4039                if (m_using_apple_tables)
4040                {
4041                    GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_types accelerator table had bad die 0x%8.8x for '%s')\n",
4042                                                                               die_offset, name.GetCString());
4043                }
4044            }
4045
4046        }
4047        const uint32_t num_matches = types.GetSize() - initial_types_size;
4048        if (log && num_matches)
4049        {
4050            if (namespace_decl)
4051            {
4052                GetObjectFile()->GetModule()->LogMessage (log,
4053                                                          "SymbolFileDWARF::FindTypes (sc, name=\"%s\", clang::NamespaceDecl(%p) \"%s\", append=%u, max_matches=%u, type_list) => %u",
4054                                                          name.GetCString(),
4055                                                          namespace_decl->GetNamespaceDecl(),
4056                                                          namespace_decl->GetQualifiedName().c_str(),
4057                                                          append,
4058                                                          max_matches,
4059                                                          num_matches);
4060            }
4061            else
4062            {
4063                GetObjectFile()->GetModule()->LogMessage (log,
4064                                                          "SymbolFileDWARF::FindTypes (sc, name=\"%s\", clang::NamespaceDecl(NULL), append=%u, max_matches=%u, type_list) => %u",
4065                                                          name.GetCString(),
4066                                                          append,
4067                                                          max_matches,
4068                                                          num_matches);
4069            }
4070        }
4071        return num_matches;
4072    }
4073    return 0;
4074}
4075
4076
4077ClangNamespaceDecl
4078SymbolFileDWARF::FindNamespace (const SymbolContext& sc,
4079                                const ConstString &name,
4080                                const lldb_private::ClangNamespaceDecl *parent_namespace_decl)
4081{
4082    Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));
4083
4084    if (log)
4085    {
4086        GetObjectFile()->GetModule()->LogMessage (log,
4087                                                  "SymbolFileDWARF::FindNamespace (sc, name=\"%s\")",
4088                                                  name.GetCString());
4089    }
4090
4091    if (!NamespaceDeclMatchesThisSymbolFile(parent_namespace_decl))
4092        return ClangNamespaceDecl();
4093
4094    ClangNamespaceDecl namespace_decl;
4095    DWARFDebugInfo* info = DebugInfo();
4096    if (info)
4097    {
4098        DIEArray die_offsets;
4099
4100        // Index if we already haven't to make sure the compile units
4101        // get indexed and make their global DIE index list
4102        if (m_using_apple_tables)
4103        {
4104            if (m_apple_namespaces_ap.get())
4105            {
4106                const char *name_cstr = name.GetCString();
4107                m_apple_namespaces_ap->FindByName (name_cstr, die_offsets);
4108            }
4109        }
4110        else
4111        {
4112            if (!m_indexed)
4113                Index ();
4114
4115            m_namespace_index.Find (name, die_offsets);
4116        }
4117
4118        DWARFCompileUnit* dwarf_cu = NULL;
4119        const DWARFDebugInfoEntry* die = NULL;
4120        const size_t num_matches = die_offsets.size();
4121        if (num_matches)
4122        {
4123            DWARFDebugInfo* debug_info = DebugInfo();
4124            for (size_t i=0; i<num_matches; ++i)
4125            {
4126                const dw_offset_t die_offset = die_offsets[i];
4127                die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);
4128
4129                if (die)
4130                {
4131                    if (parent_namespace_decl && !DIEIsInNamespace (parent_namespace_decl, dwarf_cu, die))
4132                        continue;
4133
4134                    clang::NamespaceDecl *clang_namespace_decl = ResolveNamespaceDIE (dwarf_cu, die);
4135                    if (clang_namespace_decl)
4136                    {
4137                        namespace_decl.SetASTContext (GetClangASTContext().getASTContext());
4138                        namespace_decl.SetNamespaceDecl (clang_namespace_decl);
4139                        break;
4140                    }
4141                }
4142                else
4143                {
4144                    if (m_using_apple_tables)
4145                    {
4146                        GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_namespaces accelerator table had bad die 0x%8.8x for '%s')\n",
4147                                                                   die_offset, name.GetCString());
4148                    }
4149                }
4150
4151            }
4152        }
4153    }
4154    if (log && namespace_decl.GetNamespaceDecl())
4155    {
4156        GetObjectFile()->GetModule()->LogMessage (log,
4157                                                  "SymbolFileDWARF::FindNamespace (sc, name=\"%s\") => clang::NamespaceDecl(%p) \"%s\"",
4158                                                  name.GetCString(),
4159                                                  namespace_decl.GetNamespaceDecl(),
4160                                                  namespace_decl.GetQualifiedName().c_str());
4161    }
4162
4163    return namespace_decl;
4164}
4165
4166uint32_t
4167SymbolFileDWARF::FindTypes(std::vector<dw_offset_t> die_offsets, uint32_t max_matches, TypeList& types)
4168{
4169    // Remember how many sc_list are in the list before we search in case
4170    // we are appending the results to a variable list.
4171    uint32_t original_size = types.GetSize();
4172
4173    const uint32_t num_die_offsets = die_offsets.size();
4174    // Parse all of the types we found from the pubtypes matches
4175    uint32_t i;
4176    uint32_t num_matches = 0;
4177    for (i = 0; i < num_die_offsets; ++i)
4178    {
4179        Type *matching_type = ResolveTypeUID (die_offsets[i]);
4180        if (matching_type)
4181        {
4182            // We found a type pointer, now find the shared pointer form our type list
4183            types.InsertUnique (matching_type->shared_from_this());
4184            ++num_matches;
4185            if (num_matches >= max_matches)
4186                break;
4187        }
4188    }
4189
4190    // Return the number of variable that were appended to the list
4191    return types.GetSize() - original_size;
4192}
4193
4194
4195size_t
4196SymbolFileDWARF::ParseChildParameters (const SymbolContext& sc,
4197                                       clang::DeclContext *containing_decl_ctx,
4198                                       DWARFCompileUnit* dwarf_cu,
4199                                       const DWARFDebugInfoEntry *parent_die,
4200                                       bool skip_artificial,
4201                                       bool &is_static,
4202                                       bool &is_variadic,
4203                                       TypeList* type_list,
4204                                       std::vector<ClangASTType>& function_param_types,
4205                                       std::vector<clang::ParmVarDecl*>& function_param_decls,
4206                                       unsigned &type_quals,
4207                                       ClangASTContext::TemplateParameterInfos &template_param_infos)
4208{
4209    if (parent_die == NULL)
4210        return 0;
4211
4212    const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize());
4213
4214    size_t arg_idx = 0;
4215    const DWARFDebugInfoEntry *die;
4216    for (die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling())
4217    {
4218        dw_tag_t tag = die->Tag();
4219        switch (tag)
4220        {
4221        case DW_TAG_formal_parameter:
4222            {
4223                DWARFDebugInfoEntry::Attributes attributes;
4224                const size_t num_attributes = die->GetAttributes(this, dwarf_cu, fixed_form_sizes, attributes);
4225                if (num_attributes > 0)
4226                {
4227                    const char *name = NULL;
4228                    Declaration decl;
4229                    dw_offset_t param_type_die_offset = DW_INVALID_OFFSET;
4230                    bool is_artificial = false;
4231                    // one of None, Auto, Register, Extern, Static, PrivateExtern
4232
4233                    clang::StorageClass storage = clang::SC_None;
4234                    uint32_t i;
4235                    for (i=0; i<num_attributes; ++i)
4236                    {
4237                        const dw_attr_t attr = attributes.AttributeAtIndex(i);
4238                        DWARFFormValue form_value;
4239                        if (attributes.ExtractFormValueAtIndex(this, i, form_value))
4240                        {
4241                            switch (attr)
4242                            {
4243                            case DW_AT_decl_file:   decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break;
4244                            case DW_AT_decl_line:   decl.SetLine(form_value.Unsigned()); break;
4245                            case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
4246                            case DW_AT_name:        name = form_value.AsCString(&get_debug_str_data()); break;
4247                            case DW_AT_type:        param_type_die_offset = form_value.Reference(dwarf_cu); break;
4248                            case DW_AT_artificial:  is_artificial = form_value.Boolean(); break;
4249                            case DW_AT_location:
4250    //                          if (form_value.BlockData())
4251    //                          {
4252    //                              const DWARFDataExtractor& debug_info_data = debug_info();
4253    //                              uint32_t block_length = form_value.Unsigned();
4254    //                              DWARFDataExtractor location(debug_info_data, form_value.BlockData() - debug_info_data.GetDataStart(), block_length);
4255    //                          }
4256    //                          else
4257    //                          {
4258    //                          }
4259    //                          break;
4260                            case DW_AT_const_value:
4261                            case DW_AT_default_value:
4262                            case DW_AT_description:
4263                            case DW_AT_endianity:
4264                            case DW_AT_is_optional:
4265                            case DW_AT_segment:
4266                            case DW_AT_variable_parameter:
4267                            default:
4268                            case DW_AT_abstract_origin:
4269                            case DW_AT_sibling:
4270                                break;
4271                            }
4272                        }
4273                    }
4274
4275                    bool skip = false;
4276                    if (skip_artificial)
4277                    {
4278                        if (is_artificial)
4279                        {
4280                            // In order to determine if a C++ member function is
4281                            // "const" we have to look at the const-ness of "this"...
4282                            // Ugly, but that
4283                            if (arg_idx == 0)
4284                            {
4285                                if (DeclKindIsCXXClass(containing_decl_ctx->getDeclKind()))
4286                                {
4287                                    // Often times compilers omit the "this" name for the
4288                                    // specification DIEs, so we can't rely upon the name
4289                                    // being in the formal parameter DIE...
4290                                    if (name == NULL || ::strcmp(name, "this")==0)
4291                                    {
4292                                        Type *this_type = ResolveTypeUID (param_type_die_offset);
4293                                        if (this_type)
4294                                        {
4295                                            uint32_t encoding_mask = this_type->GetEncodingMask();
4296                                            if (encoding_mask & Type::eEncodingIsPointerUID)
4297                                            {
4298                                                is_static = false;
4299
4300                                                if (encoding_mask & (1u << Type::eEncodingIsConstUID))
4301                                                    type_quals |= clang::Qualifiers::Const;
4302                                                if (encoding_mask & (1u << Type::eEncodingIsVolatileUID))
4303                                                    type_quals |= clang::Qualifiers::Volatile;
4304                                            }
4305                                        }
4306                                    }
4307                                }
4308                            }
4309                            skip = true;
4310                        }
4311                        else
4312                        {
4313
4314                            // HACK: Objective C formal parameters "self" and "_cmd"
4315                            // are not marked as artificial in the DWARF...
4316                            CompileUnit *comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX);
4317                            if (comp_unit)
4318                            {
4319                                switch (comp_unit->GetLanguage())
4320                                {
4321                                    case eLanguageTypeObjC:
4322                                    case eLanguageTypeObjC_plus_plus:
4323                                        if (name && name[0] && (strcmp (name, "self") == 0 || strcmp (name, "_cmd") == 0))
4324                                            skip = true;
4325                                        break;
4326                                    default:
4327                                        break;
4328                                }
4329                            }
4330                        }
4331                    }
4332
4333                    if (!skip)
4334                    {
4335                        Type *type = ResolveTypeUID(param_type_die_offset);
4336                        if (type)
4337                        {
4338                            function_param_types.push_back (type->GetClangForwardType());
4339
4340                            clang::ParmVarDecl *param_var_decl = GetClangASTContext().CreateParameterDeclaration (name,
4341                                                                                                                  type->GetClangForwardType(),
4342                                                                                                                  storage);
4343                            assert(param_var_decl);
4344                            function_param_decls.push_back(param_var_decl);
4345
4346                            GetClangASTContext().SetMetadataAsUserID (param_var_decl, MakeUserID(die->GetOffset()));
4347                        }
4348                    }
4349                }
4350                arg_idx++;
4351            }
4352            break;
4353
4354        case DW_TAG_unspecified_parameters:
4355            is_variadic = true;
4356            break;
4357
4358        case DW_TAG_template_type_parameter:
4359        case DW_TAG_template_value_parameter:
4360            ParseTemplateDIE (dwarf_cu, die,template_param_infos);
4361            break;
4362
4363        default:
4364            break;
4365        }
4366    }
4367    return arg_idx;
4368}
4369
4370size_t
4371SymbolFileDWARF::ParseChildEnumerators
4372(
4373    const SymbolContext& sc,
4374    lldb_private::ClangASTType &clang_type,
4375    bool is_signed,
4376    uint32_t enumerator_byte_size,
4377    DWARFCompileUnit* dwarf_cu,
4378    const DWARFDebugInfoEntry *parent_die
4379)
4380{
4381    if (parent_die == NULL)
4382        return 0;
4383
4384    size_t enumerators_added = 0;
4385    const DWARFDebugInfoEntry *die;
4386    const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize());
4387
4388    for (die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling())
4389    {
4390        const dw_tag_t tag = die->Tag();
4391        if (tag == DW_TAG_enumerator)
4392        {
4393            DWARFDebugInfoEntry::Attributes attributes;
4394            const size_t num_child_attributes = die->GetAttributes(this, dwarf_cu, fixed_form_sizes, attributes);
4395            if (num_child_attributes > 0)
4396            {
4397                const char *name = NULL;
4398                bool got_value = false;
4399                int64_t enum_value = 0;
4400                Declaration decl;
4401
4402                uint32_t i;
4403                for (i=0; i<num_child_attributes; ++i)
4404                {
4405                    const dw_attr_t attr = attributes.AttributeAtIndex(i);
4406                    DWARFFormValue form_value;
4407                    if (attributes.ExtractFormValueAtIndex(this, i, form_value))
4408                    {
4409                        switch (attr)
4410                        {
4411                        case DW_AT_const_value:
4412                            got_value = true;
4413                            if (is_signed)
4414                                enum_value = form_value.Signed();
4415                            else
4416                                enum_value = form_value.Unsigned();
4417                            break;
4418
4419                        case DW_AT_name:
4420                            name = form_value.AsCString(&get_debug_str_data());
4421                            break;
4422
4423                        case DW_AT_description:
4424                        default:
4425                        case DW_AT_decl_file:   decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break;
4426                        case DW_AT_decl_line:   decl.SetLine(form_value.Unsigned()); break;
4427                        case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
4428                        case DW_AT_sibling:
4429                            break;
4430                        }
4431                    }
4432                }
4433
4434                if (name && name[0] && got_value)
4435                {
4436                    clang_type.AddEnumerationValueToEnumerationType (clang_type.GetEnumerationIntegerType(),
4437                                                                     decl,
4438                                                                     name,
4439                                                                     enum_value,
4440                                                                     enumerator_byte_size * 8);
4441                    ++enumerators_added;
4442                }
4443            }
4444        }
4445    }
4446    return enumerators_added;
4447}
4448
4449void
4450SymbolFileDWARF::ParseChildArrayInfo
4451(
4452    const SymbolContext& sc,
4453    DWARFCompileUnit* dwarf_cu,
4454    const DWARFDebugInfoEntry *parent_die,
4455    int64_t& first_index,
4456    std::vector<uint64_t>& element_orders,
4457    uint32_t& byte_stride,
4458    uint32_t& bit_stride
4459)
4460{
4461    if (parent_die == NULL)
4462        return;
4463
4464    const DWARFDebugInfoEntry *die;
4465    const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize());
4466    for (die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling())
4467    {
4468        const dw_tag_t tag = die->Tag();
4469        switch (tag)
4470        {
4471        case DW_TAG_subrange_type:
4472            {
4473                DWARFDebugInfoEntry::Attributes attributes;
4474                const size_t num_child_attributes = die->GetAttributes(this, dwarf_cu, fixed_form_sizes, attributes);
4475                if (num_child_attributes > 0)
4476                {
4477                    uint64_t num_elements = 0;
4478                    uint64_t lower_bound = 0;
4479                    uint64_t upper_bound = 0;
4480                    bool upper_bound_valid = false;
4481                    uint32_t i;
4482                    for (i=0; i<num_child_attributes; ++i)
4483                    {
4484                        const dw_attr_t attr = attributes.AttributeAtIndex(i);
4485                        DWARFFormValue form_value;
4486                        if (attributes.ExtractFormValueAtIndex(this, i, form_value))
4487                        {
4488                            switch (attr)
4489                            {
4490                            case DW_AT_name:
4491                                break;
4492
4493                            case DW_AT_count:
4494                                num_elements = form_value.Unsigned();
4495                                break;
4496
4497                            case DW_AT_bit_stride:
4498                                bit_stride = form_value.Unsigned();
4499                                break;
4500
4501                            case DW_AT_byte_stride:
4502                                byte_stride = form_value.Unsigned();
4503                                break;
4504
4505                            case DW_AT_lower_bound:
4506                                lower_bound = form_value.Unsigned();
4507                                break;
4508
4509                            case DW_AT_upper_bound:
4510                                upper_bound_valid = true;
4511                                upper_bound = form_value.Unsigned();
4512                                break;
4513
4514                            default:
4515                            case DW_AT_abstract_origin:
4516                            case DW_AT_accessibility:
4517                            case DW_AT_allocated:
4518                            case DW_AT_associated:
4519                            case DW_AT_data_location:
4520                            case DW_AT_declaration:
4521                            case DW_AT_description:
4522                            case DW_AT_sibling:
4523                            case DW_AT_threads_scaled:
4524                            case DW_AT_type:
4525                            case DW_AT_visibility:
4526                                break;
4527                            }
4528                        }
4529                    }
4530
4531                    if (num_elements == 0)
4532                    {
4533                        if (upper_bound_valid && upper_bound >= lower_bound)
4534                            num_elements = upper_bound - lower_bound + 1;
4535                    }
4536
4537                    element_orders.push_back (num_elements);
4538                }
4539            }
4540            break;
4541        }
4542    }
4543}
4544
4545TypeSP
4546SymbolFileDWARF::GetTypeForDIE (DWARFCompileUnit *dwarf_cu, const DWARFDebugInfoEntry* die)
4547{
4548    TypeSP type_sp;
4549    if (die != NULL)
4550    {
4551        assert(dwarf_cu != NULL);
4552        Type *type_ptr = m_die_to_type.lookup (die);
4553        if (type_ptr == NULL)
4554        {
4555            CompileUnit* lldb_cu = GetCompUnitForDWARFCompUnit(dwarf_cu);
4556            assert (lldb_cu);
4557            SymbolContext sc(lldb_cu);
4558            type_sp = ParseType(sc, dwarf_cu, die, NULL);
4559        }
4560        else if (type_ptr != DIE_IS_BEING_PARSED)
4561        {
4562            // Grab the existing type from the master types lists
4563            type_sp = type_ptr->shared_from_this();
4564        }
4565
4566    }
4567    return type_sp;
4568}
4569
4570clang::DeclContext *
4571SymbolFileDWARF::GetClangDeclContextContainingDIEOffset (dw_offset_t die_offset)
4572{
4573    if (die_offset != DW_INVALID_OFFSET)
4574    {
4575        DWARFCompileUnitSP cu_sp;
4576        const DWARFDebugInfoEntry* die = DebugInfo()->GetDIEPtr(die_offset, &cu_sp);
4577        return GetClangDeclContextContainingDIE (cu_sp.get(), die, NULL);
4578    }
4579    return NULL;
4580}
4581
4582clang::DeclContext *
4583SymbolFileDWARF::GetClangDeclContextForDIEOffset (const SymbolContext &sc, dw_offset_t die_offset)
4584{
4585    if (die_offset != DW_INVALID_OFFSET)
4586    {
4587        DWARFDebugInfo* debug_info = DebugInfo();
4588        if (debug_info)
4589        {
4590            DWARFCompileUnitSP cu_sp;
4591            const DWARFDebugInfoEntry* die = debug_info->GetDIEPtr(die_offset, &cu_sp);
4592            if (die)
4593                return GetClangDeclContextForDIE (sc, cu_sp.get(), die);
4594        }
4595    }
4596    return NULL;
4597}
4598
4599clang::NamespaceDecl *
4600SymbolFileDWARF::ResolveNamespaceDIE (DWARFCompileUnit *dwarf_cu, const DWARFDebugInfoEntry *die)
4601{
4602    if (die && die->Tag() == DW_TAG_namespace)
4603    {
4604        // See if we already parsed this namespace DIE and associated it with a
4605        // uniqued namespace declaration
4606        clang::NamespaceDecl *namespace_decl = static_cast<clang::NamespaceDecl *>(m_die_to_decl_ctx[die]);
4607        if (namespace_decl)
4608            return namespace_decl;
4609        else
4610        {
4611            const char *namespace_name = die->GetAttributeValueAsString(this, dwarf_cu, DW_AT_name, NULL);
4612            clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIE (dwarf_cu, die, NULL);
4613            namespace_decl = GetClangASTContext().GetUniqueNamespaceDeclaration (namespace_name, containing_decl_ctx);
4614            Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO));
4615            if (log)
4616            {
4617                if (namespace_name)
4618                {
4619                    GetObjectFile()->GetModule()->LogMessage (log,
4620                                                              "ASTContext => %p: 0x%8.8" PRIx64 ": DW_TAG_namespace with DW_AT_name(\"%s\") => clang::NamespaceDecl *%p (original = %p)",
4621                                                              GetClangASTContext().getASTContext(),
4622                                                              MakeUserID(die->GetOffset()),
4623                                                              namespace_name,
4624                                                              namespace_decl,
4625                                                              namespace_decl->getOriginalNamespace());
4626                }
4627                else
4628                {
4629                    GetObjectFile()->GetModule()->LogMessage (log,
4630                                                              "ASTContext => %p: 0x%8.8" PRIx64 ": DW_TAG_namespace (anonymous) => clang::NamespaceDecl *%p (original = %p)",
4631                                                              GetClangASTContext().getASTContext(),
4632                                                              MakeUserID(die->GetOffset()),
4633                                                              namespace_decl,
4634                                                              namespace_decl->getOriginalNamespace());
4635                }
4636            }
4637
4638            if (namespace_decl)
4639                LinkDeclContextToDIE((clang::DeclContext*)namespace_decl, die);
4640            return namespace_decl;
4641        }
4642    }
4643    return NULL;
4644}
4645
4646clang::DeclContext *
4647SymbolFileDWARF::GetClangDeclContextForDIE (const SymbolContext &sc, DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die)
4648{
4649    clang::DeclContext *clang_decl_ctx = GetCachedClangDeclContextForDIE (die);
4650    if (clang_decl_ctx)
4651        return clang_decl_ctx;
4652    // If this DIE has a specification, or an abstract origin, then trace to those.
4653
4654    dw_offset_t die_offset = die->GetAttributeValueAsReference(this, cu, DW_AT_specification, DW_INVALID_OFFSET);
4655    if (die_offset != DW_INVALID_OFFSET)
4656        return GetClangDeclContextForDIEOffset (sc, die_offset);
4657
4658    die_offset = die->GetAttributeValueAsReference(this, cu, DW_AT_abstract_origin, DW_INVALID_OFFSET);
4659    if (die_offset != DW_INVALID_OFFSET)
4660        return GetClangDeclContextForDIEOffset (sc, die_offset);
4661
4662    Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO));
4663    if (log)
4664        GetObjectFile()->GetModule()->LogMessage(log, "SymbolFileDWARF::GetClangDeclContextForDIE (die = 0x%8.8x) %s '%s'", die->GetOffset(), DW_TAG_value_to_name(die->Tag()), die->GetName(this, cu));
4665    // This is the DIE we want.  Parse it, then query our map.
4666    bool assert_not_being_parsed = true;
4667    ResolveTypeUID (cu, die, assert_not_being_parsed);
4668
4669    clang_decl_ctx = GetCachedClangDeclContextForDIE (die);
4670
4671    return clang_decl_ctx;
4672}
4673
4674clang::DeclContext *
4675SymbolFileDWARF::GetClangDeclContextContainingDIE (DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die, const DWARFDebugInfoEntry **decl_ctx_die_copy)
4676{
4677    if (m_clang_tu_decl == NULL)
4678        m_clang_tu_decl = GetClangASTContext().getASTContext()->getTranslationUnitDecl();
4679
4680    const DWARFDebugInfoEntry *decl_ctx_die = GetDeclContextDIEContainingDIE (cu, die);
4681
4682    if (decl_ctx_die_copy)
4683        *decl_ctx_die_copy = decl_ctx_die;
4684
4685    if (decl_ctx_die)
4686    {
4687
4688        DIEToDeclContextMap::iterator pos = m_die_to_decl_ctx.find (decl_ctx_die);
4689        if (pos != m_die_to_decl_ctx.end())
4690            return pos->second;
4691
4692        switch (decl_ctx_die->Tag())
4693        {
4694        case DW_TAG_compile_unit:
4695            return m_clang_tu_decl;
4696
4697        case DW_TAG_namespace:
4698            return ResolveNamespaceDIE (cu, decl_ctx_die);
4699            break;
4700
4701        case DW_TAG_structure_type:
4702        case DW_TAG_union_type:
4703        case DW_TAG_class_type:
4704            {
4705                Type* type = ResolveType (cu, decl_ctx_die);
4706                if (type)
4707                {
4708                    clang::DeclContext *decl_ctx = type->GetClangForwardType().GetDeclContextForType ();
4709                    if (decl_ctx)
4710                    {
4711                        LinkDeclContextToDIE (decl_ctx, decl_ctx_die);
4712                        if (decl_ctx)
4713                            return decl_ctx;
4714                    }
4715                }
4716            }
4717            break;
4718
4719        default:
4720            break;
4721        }
4722    }
4723    return m_clang_tu_decl;
4724}
4725
4726
4727const DWARFDebugInfoEntry *
4728SymbolFileDWARF::GetDeclContextDIEContainingDIE (DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die)
4729{
4730    if (cu && die)
4731    {
4732        const DWARFDebugInfoEntry * const decl_die = die;
4733
4734        while (die != NULL)
4735        {
4736            // If this is the original DIE that we are searching for a declaration
4737            // for, then don't look in the cache as we don't want our own decl
4738            // context to be our decl context...
4739            if (decl_die != die)
4740            {
4741                switch (die->Tag())
4742                {
4743                    case DW_TAG_compile_unit:
4744                    case DW_TAG_namespace:
4745                    case DW_TAG_structure_type:
4746                    case DW_TAG_union_type:
4747                    case DW_TAG_class_type:
4748                        return die;
4749
4750                    default:
4751                        break;
4752                }
4753            }
4754
4755            dw_offset_t die_offset = die->GetAttributeValueAsReference(this, cu, DW_AT_specification, DW_INVALID_OFFSET);
4756            if (die_offset != DW_INVALID_OFFSET)
4757            {
4758                DWARFCompileUnit *spec_cu = cu;
4759                const DWARFDebugInfoEntry *spec_die = DebugInfo()->GetDIEPtrWithCompileUnitHint (die_offset, &spec_cu);
4760                const DWARFDebugInfoEntry *spec_die_decl_ctx_die = GetDeclContextDIEContainingDIE (spec_cu, spec_die);
4761                if (spec_die_decl_ctx_die)
4762                    return spec_die_decl_ctx_die;
4763            }
4764
4765            die_offset = die->GetAttributeValueAsReference(this, cu, DW_AT_abstract_origin, DW_INVALID_OFFSET);
4766            if (die_offset != DW_INVALID_OFFSET)
4767            {
4768                DWARFCompileUnit *abs_cu = cu;
4769                const DWARFDebugInfoEntry *abs_die = DebugInfo()->GetDIEPtrWithCompileUnitHint (die_offset, &abs_cu);
4770                const DWARFDebugInfoEntry *abs_die_decl_ctx_die = GetDeclContextDIEContainingDIE (abs_cu, abs_die);
4771                if (abs_die_decl_ctx_die)
4772                    return abs_die_decl_ctx_die;
4773            }
4774
4775            die = die->GetParent();
4776        }
4777    }
4778    return NULL;
4779}
4780
4781
4782Symbol *
4783SymbolFileDWARF::GetObjCClassSymbol (const ConstString &objc_class_name)
4784{
4785    Symbol *objc_class_symbol = NULL;
4786    if (m_obj_file)
4787    {
4788        Symtab *symtab = m_obj_file->GetSymtab ();
4789        if (symtab)
4790        {
4791            objc_class_symbol = symtab->FindFirstSymbolWithNameAndType (objc_class_name,
4792                                                                        eSymbolTypeObjCClass,
4793                                                                        Symtab::eDebugNo,
4794                                                                        Symtab::eVisibilityAny);
4795        }
4796    }
4797    return objc_class_symbol;
4798}
4799
4800// Some compilers don't emit the DW_AT_APPLE_objc_complete_type attribute. If they don't
4801// then we can end up looking through all class types for a complete type and never find
4802// the full definition. We need to know if this attribute is supported, so we determine
4803// this here and cache th result. We also need to worry about the debug map DWARF file
4804// if we are doing darwin DWARF in .o file debugging.
4805bool
4806SymbolFileDWARF::Supports_DW_AT_APPLE_objc_complete_type (DWARFCompileUnit *cu)
4807{
4808    if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolCalculate)
4809    {
4810        m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolNo;
4811        if (cu && cu->Supports_DW_AT_APPLE_objc_complete_type())
4812            m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes;
4813        else
4814        {
4815            DWARFDebugInfo* debug_info = DebugInfo();
4816            const uint32_t num_compile_units = GetNumCompileUnits();
4817            for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
4818            {
4819                DWARFCompileUnit* dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx);
4820                if (dwarf_cu != cu && dwarf_cu->Supports_DW_AT_APPLE_objc_complete_type())
4821                {
4822                    m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes;
4823                    break;
4824                }
4825            }
4826        }
4827        if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolNo && GetDebugMapSymfile ())
4828            return m_debug_map_symfile->Supports_DW_AT_APPLE_objc_complete_type (this);
4829    }
4830    return m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolYes;
4831}
4832
4833// This function can be used when a DIE is found that is a forward declaration
4834// DIE and we want to try and find a type that has the complete definition.
4835TypeSP
4836SymbolFileDWARF::FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry *die,
4837                                                       const ConstString &type_name,
4838                                                       bool must_be_implementation)
4839{
4840
4841    TypeSP type_sp;
4842
4843    if (!type_name || (must_be_implementation && !GetObjCClassSymbol (type_name)))
4844        return type_sp;
4845
4846    DIEArray die_offsets;
4847
4848    if (m_using_apple_tables)
4849    {
4850        if (m_apple_types_ap.get())
4851        {
4852            const char *name_cstr = type_name.GetCString();
4853            m_apple_types_ap->FindCompleteObjCClassByName (name_cstr, die_offsets, must_be_implementation);
4854        }
4855    }
4856    else
4857    {
4858        if (!m_indexed)
4859            Index ();
4860
4861        m_type_index.Find (type_name, die_offsets);
4862    }
4863
4864    const size_t num_matches = die_offsets.size();
4865
4866    DWARFCompileUnit* type_cu = NULL;
4867    const DWARFDebugInfoEntry* type_die = NULL;
4868    if (num_matches)
4869    {
4870        DWARFDebugInfo* debug_info = DebugInfo();
4871        for (size_t i=0; i<num_matches; ++i)
4872        {
4873            const dw_offset_t die_offset = die_offsets[i];
4874            type_die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &type_cu);
4875
4876            if (type_die)
4877            {
4878                bool try_resolving_type = false;
4879
4880                // Don't try and resolve the DIE we are looking for with the DIE itself!
4881                if (type_die != die)
4882                {
4883                    switch (type_die->Tag())
4884                    {
4885                        case DW_TAG_class_type:
4886                        case DW_TAG_structure_type:
4887                            try_resolving_type = true;
4888                            break;
4889                        default:
4890                            break;
4891                    }
4892                }
4893
4894                if (try_resolving_type)
4895                {
4896                    if (must_be_implementation && type_cu->Supports_DW_AT_APPLE_objc_complete_type())
4897                        try_resolving_type = type_die->GetAttributeValueAsUnsigned (this, type_cu, DW_AT_APPLE_objc_complete_type, 0);
4898
4899                    if (try_resolving_type)
4900                    {
4901                        Type *resolved_type = ResolveType (type_cu, type_die, false);
4902                        if (resolved_type && resolved_type != DIE_IS_BEING_PARSED)
4903                        {
4904                            DEBUG_PRINTF ("resolved 0x%8.8" PRIx64 " from %s to 0x%8.8" PRIx64 " (cu 0x%8.8" PRIx64 ")\n",
4905                                          MakeUserID(die->GetOffset()),
4906                                          m_obj_file->GetFileSpec().GetFilename().AsCString(),
4907                                          MakeUserID(type_die->GetOffset()),
4908                                          MakeUserID(type_cu->GetOffset()));
4909
4910                            if (die)
4911                                m_die_to_type[die] = resolved_type;
4912                            type_sp = resolved_type->shared_from_this();
4913                            break;
4914                        }
4915                    }
4916                }
4917            }
4918            else
4919            {
4920                if (m_using_apple_tables)
4921                {
4922                    GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_types accelerator table had bad die 0x%8.8x for '%s')\n",
4923                                                               die_offset, type_name.GetCString());
4924                }
4925            }
4926
4927        }
4928    }
4929    return type_sp;
4930}
4931
4932
4933//----------------------------------------------------------------------
4934// This function helps to ensure that the declaration contexts match for
4935// two different DIEs. Often times debug information will refer to a
4936// forward declaration of a type (the equivalent of "struct my_struct;".
4937// There will often be a declaration of that type elsewhere that has the
4938// full definition. When we go looking for the full type "my_struct", we
4939// will find one or more matches in the accelerator tables and we will
4940// then need to make sure the type was in the same declaration context
4941// as the original DIE. This function can efficiently compare two DIEs
4942// and will return true when the declaration context matches, and false
4943// when they don't.
4944//----------------------------------------------------------------------
4945bool
4946SymbolFileDWARF::DIEDeclContextsMatch (DWARFCompileUnit* cu1, const DWARFDebugInfoEntry *die1,
4947                                       DWARFCompileUnit* cu2, const DWARFDebugInfoEntry *die2)
4948{
4949    if (die1 == die2)
4950        return true;
4951
4952#if defined (LLDB_CONFIGURATION_DEBUG)
4953    // You can't and shouldn't call this function with a compile unit from
4954    // two different SymbolFileDWARF instances.
4955    assert (DebugInfo()->ContainsCompileUnit (cu1));
4956    assert (DebugInfo()->ContainsCompileUnit (cu2));
4957#endif
4958
4959    DWARFDIECollection decl_ctx_1;
4960    DWARFDIECollection decl_ctx_2;
4961    //The declaration DIE stack is a stack of the declaration context
4962    // DIEs all the way back to the compile unit. If a type "T" is
4963    // declared inside a class "B", and class "B" is declared inside
4964    // a class "A" and class "A" is in a namespace "lldb", and the
4965    // namespace is in a compile unit, there will be a stack of DIEs:
4966    //
4967    //   [0] DW_TAG_class_type for "B"
4968    //   [1] DW_TAG_class_type for "A"
4969    //   [2] DW_TAG_namespace  for "lldb"
4970    //   [3] DW_TAG_compile_unit for the source file.
4971    //
4972    // We grab both contexts and make sure that everything matches
4973    // all the way back to the compiler unit.
4974
4975    // First lets grab the decl contexts for both DIEs
4976    die1->GetDeclContextDIEs (this, cu1, decl_ctx_1);
4977    die2->GetDeclContextDIEs (this, cu2, decl_ctx_2);
4978    // Make sure the context arrays have the same size, otherwise
4979    // we are done
4980    const size_t count1 = decl_ctx_1.Size();
4981    const size_t count2 = decl_ctx_2.Size();
4982    if (count1 != count2)
4983        return false;
4984
4985    // Make sure the DW_TAG values match all the way back up the the
4986    // compile unit. If they don't, then we are done.
4987    const DWARFDebugInfoEntry *decl_ctx_die1;
4988    const DWARFDebugInfoEntry *decl_ctx_die2;
4989    size_t i;
4990    for (i=0; i<count1; i++)
4991    {
4992        decl_ctx_die1 = decl_ctx_1.GetDIEPtrAtIndex (i);
4993        decl_ctx_die2 = decl_ctx_2.GetDIEPtrAtIndex (i);
4994        if (decl_ctx_die1->Tag() != decl_ctx_die2->Tag())
4995            return false;
4996    }
4997#if defined LLDB_CONFIGURATION_DEBUG
4998
4999    // Make sure the top item in the decl context die array is always
5000    // DW_TAG_compile_unit. If it isn't then something went wrong in
5001    // the DWARFDebugInfoEntry::GetDeclContextDIEs() function...
5002    assert (decl_ctx_1.GetDIEPtrAtIndex (count1 - 1)->Tag() == DW_TAG_compile_unit);
5003
5004#endif
5005    // Always skip the compile unit when comparing by only iterating up to
5006    // "count - 1". Here we compare the names as we go.
5007    for (i=0; i<count1 - 1; i++)
5008    {
5009        decl_ctx_die1 = decl_ctx_1.GetDIEPtrAtIndex (i);
5010        decl_ctx_die2 = decl_ctx_2.GetDIEPtrAtIndex (i);
5011        const char *name1 = decl_ctx_die1->GetName(this, cu1);
5012        const char *name2 = decl_ctx_die2->GetName(this, cu2);
5013        // If the string was from a DW_FORM_strp, then the pointer will often
5014        // be the same!
5015        if (name1 == name2)
5016            continue;
5017
5018        // Name pointers are not equal, so only compare the strings
5019        // if both are not NULL.
5020        if (name1 && name2)
5021        {
5022            // If the strings don't compare, we are done...
5023            if (strcmp(name1, name2) != 0)
5024                return false;
5025        }
5026        else
5027        {
5028            // One name was NULL while the other wasn't
5029            return false;
5030        }
5031    }
5032    // We made it through all of the checks and the declaration contexts
5033    // are equal.
5034    return true;
5035}
5036
5037// This function can be used when a DIE is found that is a forward declaration
5038// DIE and we want to try and find a type that has the complete definition.
5039// "cu" and "die" must be from this SymbolFileDWARF
5040TypeSP
5041SymbolFileDWARF::FindDefinitionTypeForDIE (DWARFCompileUnit* cu,
5042                                           const DWARFDebugInfoEntry *die,
5043                                           const ConstString &type_name)
5044{
5045    TypeSP type_sp;
5046
5047#if defined (LLDB_CONFIGURATION_DEBUG)
5048    // You can't and shouldn't call this function with a compile unit from
5049    // another SymbolFileDWARF instance.
5050    assert (DebugInfo()->ContainsCompileUnit (cu));
5051#endif
5052
5053    if (cu == NULL || die == NULL || !type_name)
5054        return type_sp;
5055
5056    std::string qualified_name;
5057
5058    Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_TYPE_COMPLETION|DWARF_LOG_LOOKUPS));
5059    if (log)
5060    {
5061        die->GetQualifiedName(this, cu, qualified_name);
5062        GetObjectFile()->GetModule()->LogMessage (log,
5063                                                  "SymbolFileDWARF::FindDefinitionTypeForDIE(die=0x%8.8x (%s), name='%s')",
5064                                                  die->GetOffset(),
5065                                                  qualified_name.c_str(),
5066                                                  type_name.GetCString());
5067    }
5068
5069    DIEArray die_offsets;
5070
5071    if (m_using_apple_tables)
5072    {
5073        if (m_apple_types_ap.get())
5074        {
5075            const bool has_tag = m_apple_types_ap->GetHeader().header_data.ContainsAtom (DWARFMappedHash::eAtomTypeTag);
5076            const bool has_qualified_name_hash = m_apple_types_ap->GetHeader().header_data.ContainsAtom (DWARFMappedHash::eAtomTypeQualNameHash);
5077            if (has_tag && has_qualified_name_hash)
5078            {
5079                if (qualified_name.empty())
5080                    die->GetQualifiedName(this, cu, qualified_name);
5081
5082                const uint32_t qualified_name_hash = MappedHash::HashStringUsingDJB (qualified_name.c_str());
5083                if (log)
5084                    GetObjectFile()->GetModule()->LogMessage (log,"FindByNameAndTagAndQualifiedNameHash()");
5085                m_apple_types_ap->FindByNameAndTagAndQualifiedNameHash (type_name.GetCString(), die->Tag(), qualified_name_hash, die_offsets);
5086            }
5087            else if (has_tag > 1)
5088            {
5089                if (log)
5090                    GetObjectFile()->GetModule()->LogMessage (log,"FindByNameAndTag()");
5091                m_apple_types_ap->FindByNameAndTag (type_name.GetCString(), die->Tag(), die_offsets);
5092            }
5093            else
5094            {
5095                m_apple_types_ap->FindByName (type_name.GetCString(), die_offsets);
5096            }
5097        }
5098    }
5099    else
5100    {
5101        if (!m_indexed)
5102            Index ();
5103
5104        m_type_index.Find (type_name, die_offsets);
5105    }
5106
5107    const size_t num_matches = die_offsets.size();
5108
5109    const dw_tag_t die_tag = die->Tag();
5110
5111    DWARFCompileUnit* type_cu = NULL;
5112    const DWARFDebugInfoEntry* type_die = NULL;
5113    if (num_matches)
5114    {
5115        DWARFDebugInfo* debug_info = DebugInfo();
5116        for (size_t i=0; i<num_matches; ++i)
5117        {
5118            const dw_offset_t die_offset = die_offsets[i];
5119            type_die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &type_cu);
5120
5121            if (type_die)
5122            {
5123                bool try_resolving_type = false;
5124
5125                // Don't try and resolve the DIE we are looking for with the DIE itself!
5126                if (type_die != die)
5127                {
5128                    const dw_tag_t type_die_tag = type_die->Tag();
5129                    // Make sure the tags match
5130                    if (type_die_tag == die_tag)
5131                    {
5132                        // The tags match, lets try resolving this type
5133                        try_resolving_type = true;
5134                    }
5135                    else
5136                    {
5137                        // The tags don't match, but we need to watch our for a
5138                        // forward declaration for a struct and ("struct foo")
5139                        // ends up being a class ("class foo { ... };") or
5140                        // vice versa.
5141                        switch (type_die_tag)
5142                        {
5143                        case DW_TAG_class_type:
5144                            // We had a "class foo", see if we ended up with a "struct foo { ... };"
5145                            try_resolving_type = (die_tag == DW_TAG_structure_type);
5146                            break;
5147                        case DW_TAG_structure_type:
5148                            // We had a "struct foo", see if we ended up with a "class foo { ... };"
5149                            try_resolving_type = (die_tag == DW_TAG_class_type);
5150                            break;
5151                        default:
5152                            // Tags don't match, don't event try to resolve
5153                            // using this type whose name matches....
5154                            break;
5155                        }
5156                    }
5157                }
5158
5159                if (try_resolving_type)
5160                {
5161                    if (log)
5162                    {
5163                        std::string qualified_name;
5164                        type_die->GetQualifiedName(this, cu, qualified_name);
5165                        GetObjectFile()->GetModule()->LogMessage (log,
5166                                                                  "SymbolFileDWARF::FindDefinitionTypeForDIE(die=0x%8.8x, name='%s') trying die=0x%8.8x (%s)",
5167                                                                  die->GetOffset(),
5168                                                                  type_name.GetCString(),
5169                                                                  type_die->GetOffset(),
5170                                                                  qualified_name.c_str());
5171                    }
5172
5173                    // Make sure the decl contexts match all the way up
5174                    if (DIEDeclContextsMatch(cu, die, type_cu, type_die))
5175                    {
5176                        Type *resolved_type = ResolveType (type_cu, type_die, false);
5177                        if (resolved_type && resolved_type != DIE_IS_BEING_PARSED)
5178                        {
5179                            DEBUG_PRINTF ("resolved 0x%8.8" PRIx64 " (cu 0x%8.8" PRIx64 ") from %s to 0x%8.8" PRIx64 " (cu 0x%8.8" PRIx64 ")\n",
5180                                          MakeUserID(die->GetOffset()),
5181                                          MakeUserID(cu->GetOffset()),
5182                                          m_obj_file->GetFileSpec().GetFilename().AsCString(),
5183                                          MakeUserID(type_die->GetOffset()),
5184                                          MakeUserID(type_cu->GetOffset()));
5185
5186                            m_die_to_type[die] = resolved_type;
5187                            type_sp = resolved_type->shared_from_this();
5188                            break;
5189                        }
5190                    }
5191                }
5192                else
5193                {
5194                    if (log)
5195                    {
5196                        std::string qualified_name;
5197                        type_die->GetQualifiedName(this, cu, qualified_name);
5198                        GetObjectFile()->GetModule()->LogMessage (log,
5199                                                                  "SymbolFileDWARF::FindDefinitionTypeForDIE(die=0x%8.8x, name='%s') ignoring die=0x%8.8x (%s)",
5200                                                                  die->GetOffset(),
5201                                                                  type_name.GetCString(),
5202                                                                  type_die->GetOffset(),
5203                                                                  qualified_name.c_str());
5204                    }
5205                }
5206            }
5207            else
5208            {
5209                if (m_using_apple_tables)
5210                {
5211                    GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_types accelerator table had bad die 0x%8.8x for '%s')\n",
5212                                                                               die_offset, type_name.GetCString());
5213                }
5214            }
5215
5216        }
5217    }
5218    return type_sp;
5219}
5220
5221TypeSP
5222SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &dwarf_decl_ctx)
5223{
5224    TypeSP type_sp;
5225
5226    const uint32_t dwarf_decl_ctx_count = dwarf_decl_ctx.GetSize();
5227    if (dwarf_decl_ctx_count > 0)
5228    {
5229        const ConstString type_name(dwarf_decl_ctx[0].name);
5230        const dw_tag_t tag = dwarf_decl_ctx[0].tag;
5231
5232        if (type_name)
5233        {
5234            Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_TYPE_COMPLETION|DWARF_LOG_LOOKUPS));
5235            if (log)
5236            {
5237                GetObjectFile()->GetModule()->LogMessage (log,
5238                                                          "SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext(tag=%s, qualified-name='%s')",
5239                                                          DW_TAG_value_to_name(dwarf_decl_ctx[0].tag),
5240                                                          dwarf_decl_ctx.GetQualifiedName());
5241            }
5242
5243            DIEArray die_offsets;
5244
5245            if (m_using_apple_tables)
5246            {
5247                if (m_apple_types_ap.get())
5248                {
5249                    const bool has_tag = m_apple_types_ap->GetHeader().header_data.ContainsAtom (DWARFMappedHash::eAtomTypeTag);
5250                    const bool has_qualified_name_hash = m_apple_types_ap->GetHeader().header_data.ContainsAtom (DWARFMappedHash::eAtomTypeQualNameHash);
5251                    if (has_tag && has_qualified_name_hash)
5252                    {
5253                        const char *qualified_name = dwarf_decl_ctx.GetQualifiedName();
5254                        const uint32_t qualified_name_hash = MappedHash::HashStringUsingDJB (qualified_name);
5255                        if (log)
5256                            GetObjectFile()->GetModule()->LogMessage (log,"FindByNameAndTagAndQualifiedNameHash()");
5257                        m_apple_types_ap->FindByNameAndTagAndQualifiedNameHash (type_name.GetCString(), tag, qualified_name_hash, die_offsets);
5258                    }
5259                    else if (has_tag)
5260                    {
5261                        if (log)
5262                            GetObjectFile()->GetModule()->LogMessage (log,"FindByNameAndTag()");
5263                        m_apple_types_ap->FindByNameAndTag (type_name.GetCString(), tag, die_offsets);
5264                    }
5265                    else
5266                    {
5267                        m_apple_types_ap->FindByName (type_name.GetCString(), die_offsets);
5268                    }
5269                }
5270            }
5271            else
5272            {
5273                if (!m_indexed)
5274                    Index ();
5275
5276                m_type_index.Find (type_name, die_offsets);
5277            }
5278
5279            const size_t num_matches = die_offsets.size();
5280
5281
5282            DWARFCompileUnit* type_cu = NULL;
5283            const DWARFDebugInfoEntry* type_die = NULL;
5284            if (num_matches)
5285            {
5286                DWARFDebugInfo* debug_info = DebugInfo();
5287                for (size_t i=0; i<num_matches; ++i)
5288                {
5289                    const dw_offset_t die_offset = die_offsets[i];
5290                    type_die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &type_cu);
5291
5292                    if (type_die)
5293                    {
5294                        bool try_resolving_type = false;
5295
5296                        // Don't try and resolve the DIE we are looking for with the DIE itself!
5297                        const dw_tag_t type_tag = type_die->Tag();
5298                        // Make sure the tags match
5299                        if (type_tag == tag)
5300                        {
5301                            // The tags match, lets try resolving this type
5302                            try_resolving_type = true;
5303                        }
5304                        else
5305                        {
5306                            // The tags don't match, but we need to watch our for a
5307                            // forward declaration for a struct and ("struct foo")
5308                            // ends up being a class ("class foo { ... };") or
5309                            // vice versa.
5310                            switch (type_tag)
5311                            {
5312                                case DW_TAG_class_type:
5313                                    // We had a "class foo", see if we ended up with a "struct foo { ... };"
5314                                    try_resolving_type = (tag == DW_TAG_structure_type);
5315                                    break;
5316                                case DW_TAG_structure_type:
5317                                    // We had a "struct foo", see if we ended up with a "class foo { ... };"
5318                                    try_resolving_type = (tag == DW_TAG_class_type);
5319                                    break;
5320                                default:
5321                                    // Tags don't match, don't event try to resolve
5322                                    // using this type whose name matches....
5323                                    break;
5324                            }
5325                        }
5326
5327                        if (try_resolving_type)
5328                        {
5329                            DWARFDeclContext type_dwarf_decl_ctx;
5330                            type_die->GetDWARFDeclContext (this, type_cu, type_dwarf_decl_ctx);
5331
5332                            if (log)
5333                            {
5334                                GetObjectFile()->GetModule()->LogMessage (log,
5335                                                                          "SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext(tag=%s, qualified-name='%s') trying die=0x%8.8x (%s)",
5336                                                                          DW_TAG_value_to_name(dwarf_decl_ctx[0].tag),
5337                                                                          dwarf_decl_ctx.GetQualifiedName(),
5338                                                                          type_die->GetOffset(),
5339                                                                          type_dwarf_decl_ctx.GetQualifiedName());
5340                            }
5341
5342                            // Make sure the decl contexts match all the way up
5343                            if (dwarf_decl_ctx == type_dwarf_decl_ctx)
5344                            {
5345                                Type *resolved_type = ResolveType (type_cu, type_die, false);
5346                                if (resolved_type && resolved_type != DIE_IS_BEING_PARSED)
5347                                {
5348                                    type_sp = resolved_type->shared_from_this();
5349                                    break;
5350                                }
5351                            }
5352                        }
5353                        else
5354                        {
5355                            if (log)
5356                            {
5357                                std::string qualified_name;
5358                                type_die->GetQualifiedName(this, type_cu, qualified_name);
5359                                GetObjectFile()->GetModule()->LogMessage (log,
5360                                                                          "SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext(tag=%s, qualified-name='%s') ignoring die=0x%8.8x (%s)",
5361                                                                          DW_TAG_value_to_name(dwarf_decl_ctx[0].tag),
5362                                                                          dwarf_decl_ctx.GetQualifiedName(),
5363                                                                          type_die->GetOffset(),
5364                                                                          qualified_name.c_str());
5365                            }
5366                        }
5367                    }
5368                    else
5369                    {
5370                        if (m_using_apple_tables)
5371                        {
5372                            GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_types accelerator table had bad die 0x%8.8x for '%s')\n",
5373                                                                                       die_offset, type_name.GetCString());
5374                        }
5375                    }
5376
5377                }
5378            }
5379        }
5380    }
5381    return type_sp;
5382}
5383
5384bool
5385SymbolFileDWARF::CopyUniqueClassMethodTypes (SymbolFileDWARF *src_symfile,
5386                                             Type *class_type,
5387                                             DWARFCompileUnit* src_cu,
5388                                             const DWARFDebugInfoEntry *src_class_die,
5389                                             DWARFCompileUnit* dst_cu,
5390                                             const DWARFDebugInfoEntry *dst_class_die,
5391                                             llvm::SmallVectorImpl <const DWARFDebugInfoEntry *> &failures)
5392{
5393    if (!class_type || !src_cu || !src_class_die || !dst_cu || !dst_class_die)
5394        return false;
5395    if (src_class_die->Tag() != dst_class_die->Tag())
5396        return false;
5397
5398    // We need to complete the class type so we can get all of the method types
5399    // parsed so we can then unique those types to their equivalent counterparts
5400    // in "dst_cu" and "dst_class_die"
5401    class_type->GetClangFullType();
5402
5403    const DWARFDebugInfoEntry *src_die;
5404    const DWARFDebugInfoEntry *dst_die;
5405    UniqueCStringMap<const DWARFDebugInfoEntry *> src_name_to_die;
5406    UniqueCStringMap<const DWARFDebugInfoEntry *> dst_name_to_die;
5407    UniqueCStringMap<const DWARFDebugInfoEntry *> src_name_to_die_artificial;
5408    UniqueCStringMap<const DWARFDebugInfoEntry *> dst_name_to_die_artificial;
5409    for (src_die = src_class_die->GetFirstChild(); src_die != NULL; src_die = src_die->GetSibling())
5410    {
5411        if (src_die->Tag() == DW_TAG_subprogram)
5412        {
5413            // Make sure this is a declaration and not a concrete instance by looking
5414            // for DW_AT_declaration set to 1. Sometimes concrete function instances
5415            // are placed inside the class definitions and shouldn't be included in
5416            // the list of things are are tracking here.
5417            if (src_die->GetAttributeValueAsUnsigned(src_symfile, src_cu, DW_AT_declaration, 0) == 1)
5418            {
5419                const char *src_name = src_die->GetMangledName (src_symfile, src_cu);
5420                if (src_name)
5421                {
5422                    ConstString src_const_name(src_name);
5423                    if (src_die->GetAttributeValueAsUnsigned(src_symfile, src_cu, DW_AT_artificial, 0))
5424                        src_name_to_die_artificial.Append(src_const_name.GetCString(), src_die);
5425                    else
5426                        src_name_to_die.Append(src_const_name.GetCString(), src_die);
5427                }
5428            }
5429        }
5430    }
5431    for (dst_die = dst_class_die->GetFirstChild(); dst_die != NULL; dst_die = dst_die->GetSibling())
5432    {
5433        if (dst_die->Tag() == DW_TAG_subprogram)
5434        {
5435            // Make sure this is a declaration and not a concrete instance by looking
5436            // for DW_AT_declaration set to 1. Sometimes concrete function instances
5437            // are placed inside the class definitions and shouldn't be included in
5438            // the list of things are are tracking here.
5439            if (dst_die->GetAttributeValueAsUnsigned(this, dst_cu, DW_AT_declaration, 0) == 1)
5440            {
5441                const char *dst_name = dst_die->GetMangledName (this, dst_cu);
5442                if (dst_name)
5443                {
5444                    ConstString dst_const_name(dst_name);
5445                    if (dst_die->GetAttributeValueAsUnsigned(this, dst_cu, DW_AT_artificial, 0))
5446                        dst_name_to_die_artificial.Append(dst_const_name.GetCString(), dst_die);
5447                    else
5448                        dst_name_to_die.Append(dst_const_name.GetCString(), dst_die);
5449                }
5450            }
5451        }
5452    }
5453    const uint32_t src_size = src_name_to_die.GetSize ();
5454    const uint32_t dst_size = dst_name_to_die.GetSize ();
5455    Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO | DWARF_LOG_TYPE_COMPLETION));
5456
5457    // Is everything kosher so we can go through the members at top speed?
5458    bool fast_path = true;
5459
5460    if (src_size != dst_size)
5461    {
5462        if (src_size != 0 && dst_size != 0)
5463        {
5464            if (log)
5465                log->Printf("warning: trying to unique class DIE 0x%8.8x to 0x%8.8x, but they didn't have the same size (src=%d, dst=%d)",
5466                            src_class_die->GetOffset(),
5467                            dst_class_die->GetOffset(),
5468                            src_size,
5469                            dst_size);
5470        }
5471
5472        fast_path = false;
5473    }
5474
5475    uint32_t idx;
5476
5477    if (fast_path)
5478    {
5479        for (idx = 0; idx < src_size; ++idx)
5480        {
5481            src_die = src_name_to_die.GetValueAtIndexUnchecked (idx);
5482            dst_die = dst_name_to_die.GetValueAtIndexUnchecked (idx);
5483
5484            if (src_die->Tag() != dst_die->Tag())
5485            {
5486                if (log)
5487                    log->Printf("warning: tried to unique class DIE 0x%8.8x to 0x%8.8x, but 0x%8.8x (%s) tags didn't match 0x%8.8x (%s)",
5488                                src_class_die->GetOffset(),
5489                                dst_class_die->GetOffset(),
5490                                src_die->GetOffset(),
5491                                DW_TAG_value_to_name(src_die->Tag()),
5492                                dst_die->GetOffset(),
5493                                DW_TAG_value_to_name(src_die->Tag()));
5494                fast_path = false;
5495            }
5496
5497            const char *src_name = src_die->GetMangledName (src_symfile, src_cu);
5498            const char *dst_name = dst_die->GetMangledName (this, dst_cu);
5499
5500            // Make sure the names match
5501            if (src_name == dst_name || (strcmp (src_name, dst_name) == 0))
5502                continue;
5503
5504            if (log)
5505                log->Printf("warning: tried to unique class DIE 0x%8.8x to 0x%8.8x, but 0x%8.8x (%s) names didn't match 0x%8.8x (%s)",
5506                            src_class_die->GetOffset(),
5507                            dst_class_die->GetOffset(),
5508                            src_die->GetOffset(),
5509                            src_name,
5510                            dst_die->GetOffset(),
5511                            dst_name);
5512
5513            fast_path = false;
5514        }
5515    }
5516
5517    // Now do the work of linking the DeclContexts and Types.
5518    if (fast_path)
5519    {
5520        // We can do this quickly.  Just run across the tables index-for-index since
5521        // we know each node has matching names and tags.
5522        for (idx = 0; idx < src_size; ++idx)
5523        {
5524            src_die = src_name_to_die.GetValueAtIndexUnchecked (idx);
5525            dst_die = dst_name_to_die.GetValueAtIndexUnchecked (idx);
5526
5527            clang::DeclContext *src_decl_ctx = src_symfile->m_die_to_decl_ctx[src_die];
5528            if (src_decl_ctx)
5529            {
5530                if (log)
5531                    log->Printf ("uniquing decl context %p from 0x%8.8x for 0x%8.8x", src_decl_ctx, src_die->GetOffset(), dst_die->GetOffset());
5532                LinkDeclContextToDIE (src_decl_ctx, dst_die);
5533            }
5534            else
5535            {
5536                if (log)
5537                    log->Printf ("warning: tried to unique decl context from 0x%8.8x for 0x%8.8x, but none was found", src_die->GetOffset(), dst_die->GetOffset());
5538            }
5539
5540            Type *src_child_type = m_die_to_type[src_die];
5541            if (src_child_type)
5542            {
5543                if (log)
5544                    log->Printf ("uniquing type %p (uid=0x%" PRIx64 ") from 0x%8.8x for 0x%8.8x", src_child_type, src_child_type->GetID(), src_die->GetOffset(), dst_die->GetOffset());
5545                m_die_to_type[dst_die] = src_child_type;
5546            }
5547            else
5548            {
5549                if (log)
5550                    log->Printf ("warning: tried to unique lldb_private::Type from 0x%8.8x for 0x%8.8x, but none was found", src_die->GetOffset(), dst_die->GetOffset());
5551            }
5552        }
5553    }
5554    else
5555    {
5556        // We must do this slowly.  For each member of the destination, look
5557        // up a member in the source with the same name, check its tag, and
5558        // unique them if everything matches up.  Report failures.
5559
5560        if (!src_name_to_die.IsEmpty() && !dst_name_to_die.IsEmpty())
5561        {
5562            src_name_to_die.Sort();
5563
5564            for (idx = 0; idx < dst_size; ++idx)
5565            {
5566                const char *dst_name = dst_name_to_die.GetCStringAtIndex(idx);
5567                dst_die = dst_name_to_die.GetValueAtIndexUnchecked(idx);
5568                src_die = src_name_to_die.Find(dst_name, NULL);
5569
5570                if (src_die && (src_die->Tag() == dst_die->Tag()))
5571                {
5572                    clang::DeclContext *src_decl_ctx = src_symfile->m_die_to_decl_ctx[src_die];
5573                    if (src_decl_ctx)
5574                    {
5575                        if (log)
5576                            log->Printf ("uniquing decl context %p from 0x%8.8x for 0x%8.8x", src_decl_ctx, src_die->GetOffset(), dst_die->GetOffset());
5577                        LinkDeclContextToDIE (src_decl_ctx, dst_die);
5578                    }
5579                    else
5580                    {
5581                        if (log)
5582                            log->Printf ("warning: tried to unique decl context from 0x%8.8x for 0x%8.8x, but none was found", src_die->GetOffset(), dst_die->GetOffset());
5583                    }
5584
5585                    Type *src_child_type = m_die_to_type[src_die];
5586                    if (src_child_type)
5587                    {
5588                        if (log)
5589                            log->Printf ("uniquing type %p (uid=0x%" PRIx64 ") from 0x%8.8x for 0x%8.8x", src_child_type, src_child_type->GetID(), src_die->GetOffset(), dst_die->GetOffset());
5590                        m_die_to_type[dst_die] = src_child_type;
5591                    }
5592                    else
5593                    {
5594                        if (log)
5595                            log->Printf ("warning: tried to unique lldb_private::Type from 0x%8.8x for 0x%8.8x, but none was found", src_die->GetOffset(), dst_die->GetOffset());
5596                    }
5597                }
5598                else
5599                {
5600                    if (log)
5601                        log->Printf ("warning: couldn't find a match for 0x%8.8x", dst_die->GetOffset());
5602
5603                    failures.push_back(dst_die);
5604                }
5605            }
5606        }
5607    }
5608
5609    const uint32_t src_size_artificial = src_name_to_die_artificial.GetSize ();
5610    const uint32_t dst_size_artificial = dst_name_to_die_artificial.GetSize ();
5611
5612    UniqueCStringMap<const DWARFDebugInfoEntry *> name_to_die_artificial_not_in_src;
5613
5614    if (src_size_artificial && dst_size_artificial)
5615    {
5616        dst_name_to_die_artificial.Sort();
5617
5618        for (idx = 0; idx < src_size_artificial; ++idx)
5619        {
5620            const char *src_name_artificial = src_name_to_die_artificial.GetCStringAtIndex(idx);
5621            src_die = src_name_to_die_artificial.GetValueAtIndexUnchecked (idx);
5622            dst_die = dst_name_to_die_artificial.Find(src_name_artificial, NULL);
5623
5624            if (dst_die)
5625            {
5626                // Both classes have the artificial types, link them
5627                clang::DeclContext *src_decl_ctx = m_die_to_decl_ctx[src_die];
5628                if (src_decl_ctx)
5629                {
5630                    if (log)
5631                        log->Printf ("uniquing decl context %p from 0x%8.8x for 0x%8.8x", src_decl_ctx, src_die->GetOffset(), dst_die->GetOffset());
5632                    LinkDeclContextToDIE (src_decl_ctx, dst_die);
5633                }
5634                else
5635                {
5636                    if (log)
5637                        log->Printf ("warning: tried to unique decl context from 0x%8.8x for 0x%8.8x, but none was found", src_die->GetOffset(), dst_die->GetOffset());
5638                }
5639
5640                Type *src_child_type = m_die_to_type[src_die];
5641                if (src_child_type)
5642                {
5643                    if (log)
5644                        log->Printf ("uniquing type %p (uid=0x%" PRIx64 ") from 0x%8.8x for 0x%8.8x", src_child_type, src_child_type->GetID(), src_die->GetOffset(), dst_die->GetOffset());
5645                    m_die_to_type[dst_die] = src_child_type;
5646                }
5647                else
5648                {
5649                    if (log)
5650                        log->Printf ("warning: tried to unique lldb_private::Type from 0x%8.8x for 0x%8.8x, but none was found", src_die->GetOffset(), dst_die->GetOffset());
5651                }
5652            }
5653        }
5654    }
5655
5656    if (dst_size_artificial)
5657    {
5658        for (idx = 0; idx < dst_size_artificial; ++idx)
5659        {
5660            const char *dst_name_artificial = dst_name_to_die_artificial.GetCStringAtIndex(idx);
5661            dst_die = dst_name_to_die_artificial.GetValueAtIndexUnchecked (idx);
5662            if (log)
5663                log->Printf ("warning: need to create artificial method for 0x%8.8x for method '%s'", dst_die->GetOffset(), dst_name_artificial);
5664
5665            failures.push_back(dst_die);
5666        }
5667    }
5668
5669    return (failures.size() != 0);
5670}
5671
5672TypeSP
5673SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die, bool *type_is_new_ptr)
5674{
5675    TypeSP type_sp;
5676
5677    if (type_is_new_ptr)
5678        *type_is_new_ptr = false;
5679
5680#if defined(LLDB_CONFIGURATION_DEBUG) or defined(LLDB_CONFIGURATION_RELEASE)
5681    static DIEStack g_die_stack;
5682    DIEStack::ScopedPopper scoped_die_logger(g_die_stack);
5683#endif
5684
5685    AccessType accessibility = eAccessNone;
5686    if (die != NULL)
5687    {
5688        Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO));
5689        if (log)
5690        {
5691            const DWARFDebugInfoEntry *context_die;
5692            clang::DeclContext *context = GetClangDeclContextContainingDIE (dwarf_cu, die, &context_die);
5693
5694            GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ParseType (die = 0x%8.8x, decl_ctx = %p (die 0x%8.8x)) %s name = '%s')",
5695                        die->GetOffset(),
5696                        context,
5697                        context_die->GetOffset(),
5698                        DW_TAG_value_to_name(die->Tag()),
5699                        die->GetName(this, dwarf_cu));
5700
5701#if defined(LLDB_CONFIGURATION_DEBUG) or defined(LLDB_CONFIGURATION_RELEASE)
5702            scoped_die_logger.Push (dwarf_cu, die);
5703            g_die_stack.LogDIEs(log, this);
5704#endif
5705        }
5706//
5707//        Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO));
5708//        if (log && dwarf_cu)
5709//        {
5710//            StreamString s;
5711//            die->DumpLocation (this, dwarf_cu, s);
5712//            GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDwarf::%s %s", __FUNCTION__, s.GetData());
5713//
5714//        }
5715
5716        Type *type_ptr = m_die_to_type.lookup (die);
5717        TypeList* type_list = GetTypeList();
5718        if (type_ptr == NULL)
5719        {
5720            ClangASTContext &ast = GetClangASTContext();
5721            if (type_is_new_ptr)
5722                *type_is_new_ptr = true;
5723
5724            const dw_tag_t tag = die->Tag();
5725
5726            bool is_forward_declaration = false;
5727            DWARFDebugInfoEntry::Attributes attributes;
5728            const char *type_name_cstr = NULL;
5729            ConstString type_name_const_str;
5730            Type::ResolveState resolve_state = Type::eResolveStateUnresolved;
5731            uint64_t byte_size = 0;
5732            Declaration decl;
5733
5734            Type::EncodingDataType encoding_data_type = Type::eEncodingIsUID;
5735            ClangASTType clang_type;
5736
5737            dw_attr_t attr;
5738
5739            switch (tag)
5740            {
5741            case DW_TAG_base_type:
5742            case DW_TAG_pointer_type:
5743            case DW_TAG_reference_type:
5744            case DW_TAG_rvalue_reference_type:
5745            case DW_TAG_typedef:
5746            case DW_TAG_const_type:
5747            case DW_TAG_restrict_type:
5748            case DW_TAG_volatile_type:
5749            case DW_TAG_unspecified_type:
5750                {
5751                    // Set a bit that lets us know that we are currently parsing this
5752                    m_die_to_type[die] = DIE_IS_BEING_PARSED;
5753
5754                    const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes);
5755                    uint32_t encoding = 0;
5756                    lldb::user_id_t encoding_uid = LLDB_INVALID_UID;
5757
5758                    if (num_attributes > 0)
5759                    {
5760                        uint32_t i;
5761                        for (i=0; i<num_attributes; ++i)
5762                        {
5763                            attr = attributes.AttributeAtIndex(i);
5764                            DWARFFormValue form_value;
5765                            if (attributes.ExtractFormValueAtIndex(this, i, form_value))
5766                            {
5767                                switch (attr)
5768                                {
5769                                case DW_AT_decl_file:   decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break;
5770                                case DW_AT_decl_line:   decl.SetLine(form_value.Unsigned()); break;
5771                                case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
5772                                case DW_AT_name:
5773
5774                                    type_name_cstr = form_value.AsCString(&get_debug_str_data());
5775                                    // Work around a bug in llvm-gcc where they give a name to a reference type which doesn't
5776                                    // include the "&"...
5777                                    if (tag == DW_TAG_reference_type)
5778                                    {
5779                                        if (strchr (type_name_cstr, '&') == NULL)
5780                                            type_name_cstr = NULL;
5781                                    }
5782                                    if (type_name_cstr)
5783                                        type_name_const_str.SetCString(type_name_cstr);
5784                                    break;
5785                                case DW_AT_byte_size:   byte_size = form_value.Unsigned(); break;
5786                                case DW_AT_encoding:    encoding = form_value.Unsigned(); break;
5787                                case DW_AT_type:        encoding_uid = form_value.Reference(dwarf_cu); break;
5788                                default:
5789                                case DW_AT_sibling:
5790                                    break;
5791                                }
5792                            }
5793                        }
5794                    }
5795
5796                    DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\") type => 0x%8.8lx\n", MakeUserID(die->GetOffset()), DW_TAG_value_to_name(tag), type_name_cstr, encoding_uid);
5797
5798                    switch (tag)
5799                    {
5800                    default:
5801                        break;
5802
5803                    case DW_TAG_unspecified_type:
5804                        if (strcmp(type_name_cstr, "nullptr_t") == 0 ||
5805                            strcmp(type_name_cstr, "decltype(nullptr)") == 0 )
5806                        {
5807                            resolve_state = Type::eResolveStateFull;
5808                            clang_type = ast.GetBasicType(eBasicTypeNullPtr);
5809                            break;
5810                        }
5811                        // Fall through to base type below in case we can handle the type there...
5812
5813                    case DW_TAG_base_type:
5814                        resolve_state = Type::eResolveStateFull;
5815                        clang_type = ast.GetBuiltinTypeForDWARFEncodingAndBitSize (type_name_cstr,
5816                                                                                   encoding,
5817                                                                                   byte_size * 8);
5818                        break;
5819
5820                    case DW_TAG_pointer_type:           encoding_data_type = Type::eEncodingIsPointerUID;           break;
5821                    case DW_TAG_reference_type:         encoding_data_type = Type::eEncodingIsLValueReferenceUID;   break;
5822                    case DW_TAG_rvalue_reference_type:  encoding_data_type = Type::eEncodingIsRValueReferenceUID;   break;
5823                    case DW_TAG_typedef:                encoding_data_type = Type::eEncodingIsTypedefUID;           break;
5824                    case DW_TAG_const_type:             encoding_data_type = Type::eEncodingIsConstUID;             break;
5825                    case DW_TAG_restrict_type:          encoding_data_type = Type::eEncodingIsRestrictUID;          break;
5826                    case DW_TAG_volatile_type:          encoding_data_type = Type::eEncodingIsVolatileUID;          break;
5827                    }
5828
5829                    if (!clang_type && (encoding_data_type == Type::eEncodingIsPointerUID || encoding_data_type == Type::eEncodingIsTypedefUID) && sc.comp_unit != NULL)
5830                    {
5831                        bool translation_unit_is_objc = (sc.comp_unit->GetLanguage() == eLanguageTypeObjC || sc.comp_unit->GetLanguage() == eLanguageTypeObjC_plus_plus);
5832
5833                        if (translation_unit_is_objc)
5834                        {
5835                            if (type_name_cstr != NULL)
5836                            {
5837                                static ConstString g_objc_type_name_id("id");
5838                                static ConstString g_objc_type_name_Class("Class");
5839                                static ConstString g_objc_type_name_selector("SEL");
5840
5841                                if (type_name_const_str == g_objc_type_name_id)
5842                                {
5843                                    if (log)
5844                                        GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is Objective C 'id' built-in type.",
5845                                                                                  die->GetOffset(),
5846                                                                                  DW_TAG_value_to_name(die->Tag()),
5847                                                                                  die->GetName(this, dwarf_cu));
5848                                    clang_type = ast.GetBasicType(eBasicTypeObjCID);
5849                                    encoding_data_type = Type::eEncodingIsUID;
5850                                    encoding_uid = LLDB_INVALID_UID;
5851                                    resolve_state = Type::eResolveStateFull;
5852
5853                                }
5854                                else if (type_name_const_str == g_objc_type_name_Class)
5855                                {
5856                                    if (log)
5857                                        GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is Objective C 'Class' built-in type.",
5858                                                                                  die->GetOffset(),
5859                                                                                  DW_TAG_value_to_name(die->Tag()),
5860                                                                                  die->GetName(this, dwarf_cu));
5861                                    clang_type = ast.GetBasicType(eBasicTypeObjCClass);
5862                                    encoding_data_type = Type::eEncodingIsUID;
5863                                    encoding_uid = LLDB_INVALID_UID;
5864                                    resolve_state = Type::eResolveStateFull;
5865                                }
5866                                else if (type_name_const_str == g_objc_type_name_selector)
5867                                {
5868                                    if (log)
5869                                        GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is Objective C 'selector' built-in type.",
5870                                                                                  die->GetOffset(),
5871                                                                                  DW_TAG_value_to_name(die->Tag()),
5872                                                                                  die->GetName(this, dwarf_cu));
5873                                    clang_type = ast.GetBasicType(eBasicTypeObjCSel);
5874                                    encoding_data_type = Type::eEncodingIsUID;
5875                                    encoding_uid = LLDB_INVALID_UID;
5876                                    resolve_state = Type::eResolveStateFull;
5877                                }
5878                            }
5879                            else if (encoding_data_type == Type::eEncodingIsPointerUID && encoding_uid != LLDB_INVALID_UID)
5880                            {
5881                                // Clang sometimes erroneously emits id as objc_object*.  In that case we fix up the type to "id".
5882
5883                                DWARFDebugInfoEntry* encoding_die = dwarf_cu->GetDIEPtr(encoding_uid);
5884
5885                                if (encoding_die && encoding_die->Tag() == DW_TAG_structure_type)
5886                                {
5887                                    if (const char *struct_name = encoding_die->GetAttributeValueAsString(this, dwarf_cu, DW_AT_name, NULL))
5888                                    {
5889                                        if (!strcmp(struct_name, "objc_object"))
5890                                        {
5891                                            if (log)
5892                                                GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is 'objc_object*', which we overrode to 'id'.",
5893                                                                                          die->GetOffset(),
5894                                                                                          DW_TAG_value_to_name(die->Tag()),
5895                                                                                          die->GetName(this, dwarf_cu));
5896                                            clang_type = ast.GetBasicType(eBasicTypeObjCID);
5897                                            encoding_data_type = Type::eEncodingIsUID;
5898                                            encoding_uid = LLDB_INVALID_UID;
5899                                            resolve_state = Type::eResolveStateFull;
5900                                        }
5901                                    }
5902                                }
5903                            }
5904                        }
5905                    }
5906
5907                    type_sp.reset( new Type (MakeUserID(die->GetOffset()),
5908                                             this,
5909                                             type_name_const_str,
5910                                             byte_size,
5911                                             NULL,
5912                                             encoding_uid,
5913                                             encoding_data_type,
5914                                             &decl,
5915                                             clang_type,
5916                                             resolve_state));
5917
5918                    m_die_to_type[die] = type_sp.get();
5919
5920//                  Type* encoding_type = GetUniquedTypeForDIEOffset(encoding_uid, type_sp, NULL, 0, 0, false);
5921//                  if (encoding_type != NULL)
5922//                  {
5923//                      if (encoding_type != DIE_IS_BEING_PARSED)
5924//                          type_sp->SetEncodingType(encoding_type);
5925//                      else
5926//                          m_indirect_fixups.push_back(type_sp.get());
5927//                  }
5928                }
5929                break;
5930
5931            case DW_TAG_structure_type:
5932            case DW_TAG_union_type:
5933            case DW_TAG_class_type:
5934                {
5935                    // Set a bit that lets us know that we are currently parsing this
5936                    m_die_to_type[die] = DIE_IS_BEING_PARSED;
5937                    bool byte_size_valid = false;
5938
5939                    LanguageType class_language = eLanguageTypeUnknown;
5940                    bool is_complete_objc_class = false;
5941                    //bool struct_is_class = false;
5942                    const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes);
5943                    if (num_attributes > 0)
5944                    {
5945                        uint32_t i;
5946                        for (i=0; i<num_attributes; ++i)
5947                        {
5948                            attr = attributes.AttributeAtIndex(i);
5949                            DWARFFormValue form_value;
5950                            if (attributes.ExtractFormValueAtIndex(this, i, form_value))
5951                            {
5952                                switch (attr)
5953                                {
5954                                case DW_AT_decl_file:
5955                                    if (dwarf_cu->DW_AT_decl_file_attributes_are_invalid())
5956                                    {
5957                                        // llvm-gcc outputs invalid DW_AT_decl_file attributes that always
5958                                        // point to the compile unit file, so we clear this invalid value
5959                                        // so that we can still unique types efficiently.
5960                                        decl.SetFile(FileSpec ("<invalid>", false));
5961                                    }
5962                                    else
5963                                        decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned()));
5964                                    break;
5965
5966                                case DW_AT_decl_line:
5967                                    decl.SetLine(form_value.Unsigned());
5968                                    break;
5969
5970                                case DW_AT_decl_column:
5971                                    decl.SetColumn(form_value.Unsigned());
5972                                    break;
5973
5974                                case DW_AT_name:
5975                                    type_name_cstr = form_value.AsCString(&get_debug_str_data());
5976                                    type_name_const_str.SetCString(type_name_cstr);
5977                                    break;
5978
5979                                case DW_AT_byte_size:
5980                                    byte_size = form_value.Unsigned();
5981                                    byte_size_valid = true;
5982                                    break;
5983
5984                                case DW_AT_accessibility:
5985                                    accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned());
5986                                    break;
5987
5988                                case DW_AT_declaration:
5989                                    is_forward_declaration = form_value.Boolean();
5990                                    break;
5991
5992                                case DW_AT_APPLE_runtime_class:
5993                                    class_language = (LanguageType)form_value.Signed();
5994                                    break;
5995
5996                                case DW_AT_APPLE_objc_complete_type:
5997                                    is_complete_objc_class = form_value.Signed();
5998                                    break;
5999
6000                                case DW_AT_allocated:
6001                                case DW_AT_associated:
6002                                case DW_AT_data_location:
6003                                case DW_AT_description:
6004                                case DW_AT_start_scope:
6005                                case DW_AT_visibility:
6006                                default:
6007                                case DW_AT_sibling:
6008                                    break;
6009                                }
6010                            }
6011                        }
6012                    }
6013
6014                    UniqueDWARFASTType unique_ast_entry;
6015
6016                    // Only try and unique the type if it has a name.
6017                    if (type_name_const_str &&
6018                        GetUniqueDWARFASTTypeMap().Find (type_name_const_str,
6019                                                         this,
6020                                                         dwarf_cu,
6021                                                         die,
6022                                                         decl,
6023                                                         byte_size_valid ? byte_size : -1,
6024                                                         unique_ast_entry))
6025                    {
6026                        // We have already parsed this type or from another
6027                        // compile unit. GCC loves to use the "one definition
6028                        // rule" which can result in multiple definitions
6029                        // of the same class over and over in each compile
6030                        // unit.
6031                        type_sp = unique_ast_entry.m_type_sp;
6032                        if (type_sp)
6033                        {
6034                            m_die_to_type[die] = type_sp.get();
6035                            return type_sp;
6036                        }
6037                    }
6038
6039                    DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", MakeUserID(die->GetOffset()), DW_TAG_value_to_name(tag), type_name_cstr);
6040
6041                    int tag_decl_kind = -1;
6042                    AccessType default_accessibility = eAccessNone;
6043                    if (tag == DW_TAG_structure_type)
6044                    {
6045                        tag_decl_kind = clang::TTK_Struct;
6046                        default_accessibility = eAccessPublic;
6047                    }
6048                    else if (tag == DW_TAG_union_type)
6049                    {
6050                        tag_decl_kind = clang::TTK_Union;
6051                        default_accessibility = eAccessPublic;
6052                    }
6053                    else if (tag == DW_TAG_class_type)
6054                    {
6055                        tag_decl_kind = clang::TTK_Class;
6056                        default_accessibility = eAccessPrivate;
6057                    }
6058
6059                    if (byte_size_valid && byte_size == 0 && type_name_cstr &&
6060                        die->HasChildren() == false &&
6061                        sc.comp_unit->GetLanguage() == eLanguageTypeObjC)
6062                    {
6063                        // Work around an issue with clang at the moment where
6064                        // forward declarations for objective C classes are emitted
6065                        // as:
6066                        //  DW_TAG_structure_type [2]
6067                        //  DW_AT_name( "ForwardObjcClass" )
6068                        //  DW_AT_byte_size( 0x00 )
6069                        //  DW_AT_decl_file( "..." )
6070                        //  DW_AT_decl_line( 1 )
6071                        //
6072                        // Note that there is no DW_AT_declaration and there are
6073                        // no children, and the byte size is zero.
6074                        is_forward_declaration = true;
6075                    }
6076
6077                    if (class_language == eLanguageTypeObjC ||
6078                        class_language == eLanguageTypeObjC_plus_plus)
6079                    {
6080                        if (!is_complete_objc_class && Supports_DW_AT_APPLE_objc_complete_type(dwarf_cu))
6081                        {
6082                            // We have a valid eSymbolTypeObjCClass class symbol whose
6083                            // name matches the current objective C class that we
6084                            // are trying to find and this DIE isn't the complete
6085                            // definition (we checked is_complete_objc_class above and
6086                            // know it is false), so the real definition is in here somewhere
6087                            type_sp = FindCompleteObjCDefinitionTypeForDIE (die, type_name_const_str, true);
6088
6089                            if (!type_sp && GetDebugMapSymfile ())
6090                            {
6091                                // We weren't able to find a full declaration in
6092                                // this DWARF, see if we have a declaration anywhere
6093                                // else...
6094                                type_sp = m_debug_map_symfile->FindCompleteObjCDefinitionTypeForDIE (die, type_name_const_str, true);
6095                            }
6096
6097                            if (type_sp)
6098                            {
6099                                if (log)
6100                                {
6101                                    GetObjectFile()->GetModule()->LogMessage (log,
6102                                                                              "SymbolFileDWARF(%p) - 0x%8.8x: %s type \"%s\" is an incomplete objc type, complete type is 0x%8.8" PRIx64,
6103                                                                              this,
6104                                                                              die->GetOffset(),
6105                                                                              DW_TAG_value_to_name(tag),
6106                                                                              type_name_cstr,
6107                                                                              type_sp->GetID());
6108                                }
6109
6110                                // We found a real definition for this type elsewhere
6111                                // so lets use it and cache the fact that we found
6112                                // a complete type for this die
6113                                m_die_to_type[die] = type_sp.get();
6114                                return type_sp;
6115                            }
6116                        }
6117                    }
6118
6119
6120                    if (is_forward_declaration)
6121                    {
6122                        // We have a forward declaration to a type and we need
6123                        // to try and find a full declaration. We look in the
6124                        // current type index just in case we have a forward
6125                        // declaration followed by an actual declarations in the
6126                        // DWARF. If this fails, we need to look elsewhere...
6127                        if (log)
6128                        {
6129                            GetObjectFile()->GetModule()->LogMessage (log,
6130                                                                      "SymbolFileDWARF(%p) - 0x%8.8x: %s type \"%s\" is a forward declaration, trying to find complete type",
6131                                                                      this,
6132                                                                      die->GetOffset(),
6133                                                                      DW_TAG_value_to_name(tag),
6134                                                                      type_name_cstr);
6135                        }
6136
6137                        DWARFDeclContext die_decl_ctx;
6138                        die->GetDWARFDeclContext(this, dwarf_cu, die_decl_ctx);
6139
6140                        //type_sp = FindDefinitionTypeForDIE (dwarf_cu, die, type_name_const_str);
6141                        type_sp = FindDefinitionTypeForDWARFDeclContext (die_decl_ctx);
6142
6143                        if (!type_sp && GetDebugMapSymfile ())
6144                        {
6145                            // We weren't able to find a full declaration in
6146                            // this DWARF, see if we have a declaration anywhere
6147                            // else...
6148                            type_sp = m_debug_map_symfile->FindDefinitionTypeForDWARFDeclContext (die_decl_ctx);
6149                        }
6150
6151                        if (type_sp)
6152                        {
6153                            if (log)
6154                            {
6155                                GetObjectFile()->GetModule()->LogMessage (log,
6156                                                                          "SymbolFileDWARF(%p) - 0x%8.8x: %s type \"%s\" is a forward declaration, complete type is 0x%8.8" PRIx64,
6157                                                                          this,
6158                                                                          die->GetOffset(),
6159                                                                          DW_TAG_value_to_name(tag),
6160                                                                          type_name_cstr,
6161                                                                          type_sp->GetID());
6162                            }
6163
6164                            // We found a real definition for this type elsewhere
6165                            // so lets use it and cache the fact that we found
6166                            // a complete type for this die
6167                            m_die_to_type[die] = type_sp.get();
6168                            return type_sp;
6169                        }
6170                    }
6171                    assert (tag_decl_kind != -1);
6172                    bool clang_type_was_created = false;
6173                    clang_type.SetClangType(ast.getASTContext(), m_forward_decl_die_to_clang_type.lookup (die));
6174                    if (!clang_type)
6175                    {
6176                        const DWARFDebugInfoEntry *decl_ctx_die;
6177
6178                        clang::DeclContext *decl_ctx = GetClangDeclContextContainingDIE (dwarf_cu, die, &decl_ctx_die);
6179                        if (accessibility == eAccessNone && decl_ctx)
6180                        {
6181                            // Check the decl context that contains this class/struct/union.
6182                            // If it is a class we must give it an accessability.
6183                            const clang::Decl::Kind containing_decl_kind = decl_ctx->getDeclKind();
6184                            if (DeclKindIsCXXClass (containing_decl_kind))
6185                                accessibility = default_accessibility;
6186                        }
6187
6188                        ClangASTMetadata metadata;
6189                        metadata.SetUserID(MakeUserID(die->GetOffset()));
6190                        metadata.SetIsDynamicCXXType(ClassOrStructIsVirtual (dwarf_cu, die));
6191
6192                        if (type_name_cstr && strchr (type_name_cstr, '<'))
6193                        {
6194                            ClangASTContext::TemplateParameterInfos template_param_infos;
6195                            if (ParseTemplateParameterInfos (dwarf_cu, die, template_param_infos))
6196                            {
6197                                clang::ClassTemplateDecl *class_template_decl = ParseClassTemplateDecl (decl_ctx,
6198                                                                                                        accessibility,
6199                                                                                                        type_name_cstr,
6200                                                                                                        tag_decl_kind,
6201                                                                                                        template_param_infos);
6202
6203                                clang::ClassTemplateSpecializationDecl *class_specialization_decl = ast.CreateClassTemplateSpecializationDecl (decl_ctx,
6204                                                                                                                                               class_template_decl,
6205                                                                                                                                               tag_decl_kind,
6206                                                                                                                                               template_param_infos);
6207                                clang_type = ast.CreateClassTemplateSpecializationType (class_specialization_decl);
6208                                clang_type_was_created = true;
6209
6210                                GetClangASTContext().SetMetadata (class_template_decl, metadata);
6211                                GetClangASTContext().SetMetadata (class_specialization_decl, metadata);
6212                            }
6213                        }
6214
6215                        if (!clang_type_was_created)
6216                        {
6217                            clang_type_was_created = true;
6218                            clang_type = ast.CreateRecordType (decl_ctx,
6219                                                               accessibility,
6220                                                               type_name_cstr,
6221                                                               tag_decl_kind,
6222                                                               class_language,
6223                                                               &metadata);
6224                        }
6225                    }
6226
6227                    // Store a forward declaration to this class type in case any
6228                    // parameters in any class methods need it for the clang
6229                    // types for function prototypes.
6230                    LinkDeclContextToDIE(clang_type.GetDeclContextForType(), die);
6231                    type_sp.reset (new Type (MakeUserID(die->GetOffset()),
6232                                             this,
6233                                             type_name_const_str,
6234                                             byte_size,
6235                                             NULL,
6236                                             LLDB_INVALID_UID,
6237                                             Type::eEncodingIsUID,
6238                                             &decl,
6239                                             clang_type,
6240                                             Type::eResolveStateForward));
6241
6242                    type_sp->SetIsCompleteObjCClass(is_complete_objc_class);
6243
6244
6245                    // Add our type to the unique type map so we don't
6246                    // end up creating many copies of the same type over
6247                    // and over in the ASTContext for our module
6248                    unique_ast_entry.m_type_sp = type_sp;
6249                    unique_ast_entry.m_symfile = this;
6250                    unique_ast_entry.m_cu = dwarf_cu;
6251                    unique_ast_entry.m_die = die;
6252                    unique_ast_entry.m_declaration = decl;
6253                    unique_ast_entry.m_byte_size = byte_size;
6254                    GetUniqueDWARFASTTypeMap().Insert (type_name_const_str,
6255                                                       unique_ast_entry);
6256
6257                    if (is_forward_declaration && die->HasChildren())
6258                    {
6259                        // Check to see if the DIE actually has a definition, some version of GCC will
6260                        // emit DIEs with DW_AT_declaration set to true, but yet still have subprogram,
6261                        // members, or inheritance, so we can't trust it
6262                        const DWARFDebugInfoEntry *child_die = die->GetFirstChild();
6263                        while (child_die)
6264                        {
6265                            switch (child_die->Tag())
6266                            {
6267                                case DW_TAG_inheritance:
6268                                case DW_TAG_subprogram:
6269                                case DW_TAG_member:
6270                                case DW_TAG_APPLE_property:
6271                                case DW_TAG_class_type:
6272                                case DW_TAG_structure_type:
6273                                case DW_TAG_enumeration_type:
6274                                case DW_TAG_typedef:
6275                                case DW_TAG_union_type:
6276                                    child_die = NULL;
6277                                    is_forward_declaration = false;
6278                                    break;
6279                                default:
6280                                    child_die = child_die->GetSibling();
6281                                    break;
6282                            }
6283                        }
6284                    }
6285
6286                    if (!is_forward_declaration)
6287                    {
6288                        // Always start the definition for a class type so that
6289                        // if the class has child classes or types that require
6290                        // the class to be created for use as their decl contexts
6291                        // the class will be ready to accept these child definitions.
6292                        if (die->HasChildren() == false)
6293                        {
6294                            // No children for this struct/union/class, lets finish it
6295                            clang_type.StartTagDeclarationDefinition ();
6296                            clang_type.CompleteTagDeclarationDefinition ();
6297
6298                            if (tag == DW_TAG_structure_type) // this only applies in C
6299                            {
6300                                clang::RecordDecl *record_decl = clang_type.GetAsRecordDecl();
6301
6302                                if (record_decl)
6303                                {
6304                                    LayoutInfo layout_info;
6305
6306                                    layout_info.alignment = 0;
6307                                    layout_info.bit_size = 0;
6308
6309                                    m_record_decl_to_layout_map.insert(std::make_pair(record_decl, layout_info));
6310                                }
6311                            }
6312                        }
6313                        else if (clang_type_was_created)
6314                        {
6315                            // Start the definition if the class is not objective C since
6316                            // the underlying decls respond to isCompleteDefinition(). Objective
6317                            // C decls dont' respond to isCompleteDefinition() so we can't
6318                            // start the declaration definition right away. For C++ classs/union/structs
6319                            // we want to start the definition in case the class is needed as the
6320                            // declaration context for a contained class or type without the need
6321                            // to complete that type..
6322
6323                            if (class_language != eLanguageTypeObjC &&
6324                                class_language != eLanguageTypeObjC_plus_plus)
6325                                clang_type.StartTagDeclarationDefinition ();
6326
6327                            // Leave this as a forward declaration until we need
6328                            // to know the details of the type. lldb_private::Type
6329                            // will automatically call the SymbolFile virtual function
6330                            // "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition(Type *)"
6331                            // When the definition needs to be defined.
6332                            m_forward_decl_die_to_clang_type[die] = clang_type.GetOpaqueQualType();
6333                            m_forward_decl_clang_type_to_die[clang_type.RemoveFastQualifiers().GetOpaqueQualType()] = die;
6334                            clang_type.SetHasExternalStorage (true);
6335                        }
6336                    }
6337
6338                }
6339                break;
6340
6341            case DW_TAG_enumeration_type:
6342                {
6343                    // Set a bit that lets us know that we are currently parsing this
6344                    m_die_to_type[die] = DIE_IS_BEING_PARSED;
6345
6346                    lldb::user_id_t encoding_uid = DW_INVALID_OFFSET;
6347
6348                    const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes);
6349                    if (num_attributes > 0)
6350                    {
6351                        uint32_t i;
6352
6353                        for (i=0; i<num_attributes; ++i)
6354                        {
6355                            attr = attributes.AttributeAtIndex(i);
6356                            DWARFFormValue form_value;
6357                            if (attributes.ExtractFormValueAtIndex(this, i, form_value))
6358                            {
6359                                switch (attr)
6360                                {
6361                                case DW_AT_decl_file:       decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break;
6362                                case DW_AT_decl_line:       decl.SetLine(form_value.Unsigned()); break;
6363                                case DW_AT_decl_column:     decl.SetColumn(form_value.Unsigned()); break;
6364                                case DW_AT_name:
6365                                    type_name_cstr = form_value.AsCString(&get_debug_str_data());
6366                                    type_name_const_str.SetCString(type_name_cstr);
6367                                    break;
6368                                case DW_AT_type:            encoding_uid = form_value.Reference(dwarf_cu); break;
6369                                case DW_AT_byte_size:       byte_size = form_value.Unsigned(); break;
6370                                case DW_AT_accessibility:   break; //accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
6371                                case DW_AT_declaration:     break; //is_forward_declaration = form_value.Boolean(); break;
6372                                case DW_AT_allocated:
6373                                case DW_AT_associated:
6374                                case DW_AT_bit_stride:
6375                                case DW_AT_byte_stride:
6376                                case DW_AT_data_location:
6377                                case DW_AT_description:
6378                                case DW_AT_start_scope:
6379                                case DW_AT_visibility:
6380                                case DW_AT_specification:
6381                                case DW_AT_abstract_origin:
6382                                case DW_AT_sibling:
6383                                    break;
6384                                }
6385                            }
6386                        }
6387
6388                        DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", MakeUserID(die->GetOffset()), DW_TAG_value_to_name(tag), type_name_cstr);
6389
6390                        ClangASTType enumerator_clang_type;
6391                        clang_type.SetClangType (ast.getASTContext(), m_forward_decl_die_to_clang_type.lookup (die));
6392                        if (!clang_type)
6393                        {
6394                            if (encoding_uid != DW_INVALID_OFFSET)
6395                            {
6396                                Type *enumerator_type = ResolveTypeUID(encoding_uid);
6397                                if (enumerator_type)
6398                                    enumerator_clang_type = enumerator_type->GetClangFullType();
6399                            }
6400
6401                            if (!enumerator_clang_type)
6402                                enumerator_clang_type = ast.GetBuiltinTypeForDWARFEncodingAndBitSize (NULL,
6403                                                                                                      DW_ATE_signed,
6404                                                                                                      byte_size * 8);
6405
6406                            clang_type = ast.CreateEnumerationType (type_name_cstr,
6407                                                                    GetClangDeclContextContainingDIE (dwarf_cu, die, NULL),
6408                                                                    decl,
6409                                                                    enumerator_clang_type);
6410                        }
6411                        else
6412                        {
6413                            enumerator_clang_type = clang_type.GetEnumerationIntegerType ();
6414                        }
6415
6416                        LinkDeclContextToDIE(clang_type.GetDeclContextForType(), die);
6417
6418                        type_sp.reset( new Type (MakeUserID(die->GetOffset()),
6419                                                 this,
6420                                                 type_name_const_str,
6421                                                 byte_size,
6422                                                 NULL,
6423                                                 encoding_uid,
6424                                                 Type::eEncodingIsUID,
6425                                                 &decl,
6426                                                 clang_type,
6427                                                 Type::eResolveStateForward));
6428
6429                        clang_type.StartTagDeclarationDefinition ();
6430                        if (die->HasChildren())
6431                        {
6432                            SymbolContext cu_sc(GetCompUnitForDWARFCompUnit(dwarf_cu));
6433                            bool is_signed = false;
6434                            enumerator_clang_type.IsIntegerType(is_signed);
6435                            ParseChildEnumerators(cu_sc, clang_type, is_signed, type_sp->GetByteSize(), dwarf_cu, die);
6436                        }
6437                        clang_type.CompleteTagDeclarationDefinition ();
6438                    }
6439                }
6440                break;
6441
6442            case DW_TAG_inlined_subroutine:
6443            case DW_TAG_subprogram:
6444            case DW_TAG_subroutine_type:
6445                {
6446                    // Set a bit that lets us know that we are currently parsing this
6447                    m_die_to_type[die] = DIE_IS_BEING_PARSED;
6448
6449                    //const char *mangled = NULL;
6450                    dw_offset_t type_die_offset = DW_INVALID_OFFSET;
6451                    bool is_variadic = false;
6452                    bool is_inline = false;
6453                    bool is_static = false;
6454                    bool is_virtual = false;
6455                    bool is_explicit = false;
6456                    bool is_artificial = false;
6457                    dw_offset_t specification_die_offset = DW_INVALID_OFFSET;
6458                    dw_offset_t abstract_origin_die_offset = DW_INVALID_OFFSET;
6459                    dw_offset_t object_pointer_die_offset = DW_INVALID_OFFSET;
6460
6461                    unsigned type_quals = 0;
6462                    clang::StorageClass storage = clang::SC_None;//, Extern, Static, PrivateExtern
6463
6464
6465                    const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes);
6466                    if (num_attributes > 0)
6467                    {
6468                        uint32_t i;
6469                        for (i=0; i<num_attributes; ++i)
6470                        {
6471                            attr = attributes.AttributeAtIndex(i);
6472                            DWARFFormValue form_value;
6473                            if (attributes.ExtractFormValueAtIndex(this, i, form_value))
6474                            {
6475                                switch (attr)
6476                                {
6477                                case DW_AT_decl_file:   decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break;
6478                                case DW_AT_decl_line:   decl.SetLine(form_value.Unsigned()); break;
6479                                case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
6480                                case DW_AT_name:
6481                                    type_name_cstr = form_value.AsCString(&get_debug_str_data());
6482                                    type_name_const_str.SetCString(type_name_cstr);
6483                                    break;
6484
6485                                case DW_AT_linkage_name:
6486                                case DW_AT_MIPS_linkage_name:   break; // mangled = form_value.AsCString(&get_debug_str_data()); break;
6487                                case DW_AT_type:                type_die_offset = form_value.Reference(dwarf_cu); break;
6488                                case DW_AT_accessibility:       accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
6489                                case DW_AT_declaration:         break; // is_forward_declaration = form_value.Boolean(); break;
6490                                case DW_AT_inline:              is_inline = form_value.Boolean(); break;
6491                                case DW_AT_virtuality:          is_virtual = form_value.Boolean();  break;
6492                                case DW_AT_explicit:            is_explicit = form_value.Boolean();  break;
6493                                case DW_AT_artificial:          is_artificial = form_value.Boolean();  break;
6494
6495
6496                                case DW_AT_external:
6497                                    if (form_value.Unsigned())
6498                                    {
6499                                        if (storage == clang::SC_None)
6500                                            storage = clang::SC_Extern;
6501                                        else
6502                                            storage = clang::SC_PrivateExtern;
6503                                    }
6504                                    break;
6505
6506                                case DW_AT_specification:
6507                                    specification_die_offset = form_value.Reference(dwarf_cu);
6508                                    break;
6509
6510                                case DW_AT_abstract_origin:
6511                                    abstract_origin_die_offset = form_value.Reference(dwarf_cu);
6512                                    break;
6513
6514                                case DW_AT_object_pointer:
6515                                    object_pointer_die_offset = form_value.Reference(dwarf_cu);
6516                                    break;
6517
6518                                case DW_AT_allocated:
6519                                case DW_AT_associated:
6520                                case DW_AT_address_class:
6521                                case DW_AT_calling_convention:
6522                                case DW_AT_data_location:
6523                                case DW_AT_elemental:
6524                                case DW_AT_entry_pc:
6525                                case DW_AT_frame_base:
6526                                case DW_AT_high_pc:
6527                                case DW_AT_low_pc:
6528                                case DW_AT_prototyped:
6529                                case DW_AT_pure:
6530                                case DW_AT_ranges:
6531                                case DW_AT_recursive:
6532                                case DW_AT_return_addr:
6533                                case DW_AT_segment:
6534                                case DW_AT_start_scope:
6535                                case DW_AT_static_link:
6536                                case DW_AT_trampoline:
6537                                case DW_AT_visibility:
6538                                case DW_AT_vtable_elem_location:
6539                                case DW_AT_description:
6540                                case DW_AT_sibling:
6541                                    break;
6542                                }
6543                            }
6544                        }
6545                    }
6546
6547                    std::string object_pointer_name;
6548                    if (object_pointer_die_offset != DW_INVALID_OFFSET)
6549                    {
6550                        // Get the name from the object pointer die
6551                        StreamString s;
6552                        if (DWARFDebugInfoEntry::GetName (this, dwarf_cu, object_pointer_die_offset, s))
6553                        {
6554                            object_pointer_name.assign(s.GetData());
6555                        }
6556                    }
6557
6558                    DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", MakeUserID(die->GetOffset()), DW_TAG_value_to_name(tag), type_name_cstr);
6559
6560                    ClangASTType return_clang_type;
6561                    Type *func_type = NULL;
6562
6563                    if (type_die_offset != DW_INVALID_OFFSET)
6564                        func_type = ResolveTypeUID(type_die_offset);
6565
6566                    if (func_type)
6567                        return_clang_type = func_type->GetClangForwardType();
6568                    else
6569                        return_clang_type = ast.GetBasicType(eBasicTypeVoid);
6570
6571
6572                    std::vector<ClangASTType> function_param_types;
6573                    std::vector<clang::ParmVarDecl*> function_param_decls;
6574
6575                    // Parse the function children for the parameters
6576
6577                    const DWARFDebugInfoEntry *decl_ctx_die = NULL;
6578                    clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIE (dwarf_cu, die, &decl_ctx_die);
6579                    const clang::Decl::Kind containing_decl_kind = containing_decl_ctx->getDeclKind();
6580
6581                    const bool is_cxx_method = DeclKindIsCXXClass (containing_decl_kind);
6582                    // Start off static. This will be set to false in ParseChildParameters(...)
6583                    // if we find a "this" paramters as the first parameter
6584                    if (is_cxx_method)
6585                        is_static = true;
6586                    ClangASTContext::TemplateParameterInfos template_param_infos;
6587
6588                    if (die->HasChildren())
6589                    {
6590                        bool skip_artificial = true;
6591                        ParseChildParameters (sc,
6592                                              containing_decl_ctx,
6593                                              dwarf_cu,
6594                                              die,
6595                                              skip_artificial,
6596                                              is_static,
6597                                              is_variadic,
6598                                              type_list,
6599                                              function_param_types,
6600                                              function_param_decls,
6601                                              type_quals,
6602                                              template_param_infos);
6603                    }
6604
6605                    // clang_type will get the function prototype clang type after this call
6606                    clang_type = ast.CreateFunctionType (return_clang_type,
6607                                                         function_param_types.data(),
6608                                                         function_param_types.size(),
6609                                                         is_variadic,
6610                                                         type_quals);
6611
6612                    bool ignore_containing_context = false;
6613
6614                    if (type_name_cstr)
6615                    {
6616                        bool type_handled = false;
6617                        if (tag == DW_TAG_subprogram)
6618                        {
6619                            ObjCLanguageRuntime::MethodName objc_method (type_name_cstr, true);
6620                            if (objc_method.IsValid(true))
6621                            {
6622                                SymbolContext empty_sc;
6623                                ClangASTType class_opaque_type;
6624                                ConstString class_name(objc_method.GetClassName());
6625                                if (class_name)
6626                                {
6627                                    TypeList types;
6628                                    TypeSP complete_objc_class_type_sp (FindCompleteObjCDefinitionTypeForDIE (NULL, class_name, false));
6629
6630                                    if (complete_objc_class_type_sp)
6631                                    {
6632                                        ClangASTType type_clang_forward_type = complete_objc_class_type_sp->GetClangForwardType();
6633                                        if (type_clang_forward_type.IsObjCObjectOrInterfaceType ())
6634                                            class_opaque_type = type_clang_forward_type;
6635                                    }
6636                                }
6637
6638                                if (class_opaque_type)
6639                                {
6640                                    // If accessibility isn't set to anything valid, assume public for
6641                                    // now...
6642                                    if (accessibility == eAccessNone)
6643                                        accessibility = eAccessPublic;
6644
6645                                    clang::ObjCMethodDecl *objc_method_decl = class_opaque_type.AddMethodToObjCObjectType (type_name_cstr,
6646                                                                                                                           clang_type,
6647                                                                                                                           accessibility,
6648                                                                                                                           is_artificial);
6649                                    type_handled = objc_method_decl != NULL;
6650                                    if (type_handled)
6651                                    {
6652                                        LinkDeclContextToDIE(ClangASTContext::GetAsDeclContext(objc_method_decl), die);
6653                                        GetClangASTContext().SetMetadataAsUserID (objc_method_decl, MakeUserID(die->GetOffset()));
6654                                    }
6655                                    else
6656                                    {
6657                                        GetObjectFile()->GetModule()->ReportError ("{0x%8.8x}: invalid Objective-C method 0x%4.4x (%s), please file a bug and attach the file at the start of this error message",
6658                                                                                   die->GetOffset(),
6659                                                                                   tag,
6660                                                                                   DW_TAG_value_to_name(tag));
6661                                    }
6662                                }
6663                            }
6664                            else if (is_cxx_method)
6665                            {
6666                                // Look at the parent of this DIE and see if is is
6667                                // a class or struct and see if this is actually a
6668                                // C++ method
6669                                Type *class_type = ResolveType (dwarf_cu, decl_ctx_die);
6670                                if (class_type)
6671                                {
6672                                    if (class_type->GetID() != MakeUserID(decl_ctx_die->GetOffset()))
6673                                    {
6674                                        // We uniqued the parent class of this function to another class
6675                                        // so we now need to associate all dies under "decl_ctx_die" to
6676                                        // DIEs in the DIE for "class_type"...
6677                                        SymbolFileDWARF *class_symfile = NULL;
6678                                        DWARFCompileUnitSP class_type_cu_sp;
6679                                        const DWARFDebugInfoEntry *class_type_die = NULL;
6680
6681                                        SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile();
6682                                        if (debug_map_symfile)
6683                                        {
6684                                            class_symfile = debug_map_symfile->GetSymbolFileByOSOIndex(SymbolFileDWARFDebugMap::GetOSOIndexFromUserID(class_type->GetID()));
6685                                            class_type_die = class_symfile->DebugInfo()->GetDIEPtr(class_type->GetID(), &class_type_cu_sp);
6686                                        }
6687                                        else
6688                                        {
6689                                            class_symfile = this;
6690                                            class_type_die = DebugInfo()->GetDIEPtr(class_type->GetID(), &class_type_cu_sp);
6691                                        }
6692                                        if (class_type_die)
6693                                        {
6694                                            llvm::SmallVector<const DWARFDebugInfoEntry *, 0> failures;
6695
6696                                            CopyUniqueClassMethodTypes (class_symfile,
6697                                                                        class_type,
6698                                                                        class_type_cu_sp.get(),
6699                                                                        class_type_die,
6700                                                                        dwarf_cu,
6701                                                                        decl_ctx_die,
6702                                                                        failures);
6703
6704                                            // FIXME do something with these failures that's smarter than
6705                                            // just dropping them on the ground.  Unfortunately classes don't
6706                                            // like having stuff added to them after their definitions are
6707                                            // complete...
6708
6709                                            type_ptr = m_die_to_type[die];
6710                                            if (type_ptr && type_ptr != DIE_IS_BEING_PARSED)
6711                                            {
6712                                                type_sp = type_ptr->shared_from_this();
6713                                                break;
6714                                            }
6715                                        }
6716                                    }
6717
6718                                    if (specification_die_offset != DW_INVALID_OFFSET)
6719                                    {
6720                                        // We have a specification which we are going to base our function
6721                                        // prototype off of, so we need this type to be completed so that the
6722                                        // m_die_to_decl_ctx for the method in the specification has a valid
6723                                        // clang decl context.
6724                                        class_type->GetClangForwardType();
6725                                        // If we have a specification, then the function type should have been
6726                                        // made with the specification and not with this die.
6727                                        DWARFCompileUnitSP spec_cu_sp;
6728                                        const DWARFDebugInfoEntry* spec_die = DebugInfo()->GetDIEPtr(specification_die_offset, &spec_cu_sp);
6729                                        clang::DeclContext *spec_clang_decl_ctx = GetClangDeclContextForDIE (sc, dwarf_cu, spec_die);
6730                                        if (spec_clang_decl_ctx)
6731                                        {
6732                                            LinkDeclContextToDIE(spec_clang_decl_ctx, die);
6733                                        }
6734                                        else
6735                                        {
6736                                            GetObjectFile()->GetModule()->ReportWarning ("0x%8.8" PRIx64 ": DW_AT_specification(0x%8.8x) has no decl\n",
6737                                                                                         MakeUserID(die->GetOffset()),
6738                                                                                         specification_die_offset);
6739                                        }
6740                                        type_handled = true;
6741                                    }
6742                                    else if (abstract_origin_die_offset != DW_INVALID_OFFSET)
6743                                    {
6744                                        // We have a specification which we are going to base our function
6745                                        // prototype off of, so we need this type to be completed so that the
6746                                        // m_die_to_decl_ctx for the method in the abstract origin has a valid
6747                                        // clang decl context.
6748                                        class_type->GetClangForwardType();
6749
6750                                        DWARFCompileUnitSP abs_cu_sp;
6751                                        const DWARFDebugInfoEntry* abs_die = DebugInfo()->GetDIEPtr(abstract_origin_die_offset, &abs_cu_sp);
6752                                        clang::DeclContext *abs_clang_decl_ctx = GetClangDeclContextForDIE (sc, dwarf_cu, abs_die);
6753                                        if (abs_clang_decl_ctx)
6754                                        {
6755                                            LinkDeclContextToDIE (abs_clang_decl_ctx, die);
6756                                        }
6757                                        else
6758                                        {
6759                                            GetObjectFile()->GetModule()->ReportWarning ("0x%8.8" PRIx64 ": DW_AT_abstract_origin(0x%8.8x) has no decl\n",
6760                                                                                         MakeUserID(die->GetOffset()),
6761                                                                                         abstract_origin_die_offset);
6762                                        }
6763                                        type_handled = true;
6764                                    }
6765                                    else
6766                                    {
6767                                        ClangASTType class_opaque_type = class_type->GetClangForwardType();
6768                                        if (class_opaque_type.IsCXXClassType ())
6769                                        {
6770                                            if (class_opaque_type.IsBeingDefined ())
6771                                            {
6772                                                // Neither GCC 4.2 nor clang++ currently set a valid accessibility
6773                                                // in the DWARF for C++ methods... Default to public for now...
6774                                                if (accessibility == eAccessNone)
6775                                                    accessibility = eAccessPublic;
6776
6777                                                if (!is_static && !die->HasChildren())
6778                                                {
6779                                                    // We have a C++ member function with no children (this pointer!)
6780                                                    // and clang will get mad if we try and make a function that isn't
6781                                                    // well formed in the DWARF, so we will just skip it...
6782                                                    type_handled = true;
6783                                                }
6784                                                else
6785                                                {
6786                                                    clang::CXXMethodDecl *cxx_method_decl;
6787                                                    // REMOVE THE CRASH DESCRIPTION BELOW
6788                                                    Host::SetCrashDescriptionWithFormat ("SymbolFileDWARF::ParseType() is adding a method %s to class %s in DIE 0x%8.8" PRIx64 " from %s",
6789                                                                                         type_name_cstr,
6790                                                                                         class_type->GetName().GetCString(),
6791                                                                                         MakeUserID(die->GetOffset()),
6792                                                                                         m_obj_file->GetFileSpec().GetPath().c_str());
6793
6794                                                    const bool is_attr_used = false;
6795
6796                                                    cxx_method_decl = class_opaque_type.AddMethodToCXXRecordType (type_name_cstr,
6797                                                                                                                  clang_type,
6798                                                                                                                  accessibility,
6799                                                                                                                  is_virtual,
6800                                                                                                                  is_static,
6801                                                                                                                  is_inline,
6802                                                                                                                  is_explicit,
6803                                                                                                                  is_attr_used,
6804                                                                                                                  is_artificial);
6805
6806                                                    type_handled = cxx_method_decl != NULL;
6807
6808                                                    if (type_handled)
6809                                                    {
6810                                                        LinkDeclContextToDIE(ClangASTContext::GetAsDeclContext(cxx_method_decl), die);
6811
6812                                                        Host::SetCrashDescription (NULL);
6813
6814
6815                                                        ClangASTMetadata metadata;
6816                                                        metadata.SetUserID(MakeUserID(die->GetOffset()));
6817
6818                                                        if (!object_pointer_name.empty())
6819                                                        {
6820                                                            metadata.SetObjectPtrName(object_pointer_name.c_str());
6821                                                            if (log)
6822                                                                log->Printf ("Setting object pointer name: %s on method object %p.\n",
6823                                                                             object_pointer_name.c_str(),
6824                                                                             cxx_method_decl);
6825                                                        }
6826                                                        GetClangASTContext().SetMetadata (cxx_method_decl, metadata);
6827                                                    }
6828                                                    else
6829                                                    {
6830                                                        ignore_containing_context = true;
6831                                                    }
6832                                                }
6833                                            }
6834                                            else
6835                                            {
6836                                                // We were asked to parse the type for a method in a class, yet the
6837                                                // class hasn't been asked to complete itself through the
6838                                                // clang::ExternalASTSource protocol, so we need to just have the
6839                                                // class complete itself and do things the right way, then our
6840                                                // DIE should then have an entry in the m_die_to_type map. First
6841                                                // we need to modify the m_die_to_type so it doesn't think we are
6842                                                // trying to parse this DIE anymore...
6843                                                m_die_to_type[die] = NULL;
6844
6845                                                // Now we get the full type to force our class type to complete itself
6846                                                // using the clang::ExternalASTSource protocol which will parse all
6847                                                // base classes and all methods (including the method for this DIE).
6848                                                class_type->GetClangFullType();
6849
6850                                                // The type for this DIE should have been filled in the function call above
6851                                                type_ptr = m_die_to_type[die];
6852                                                if (type_ptr && type_ptr != DIE_IS_BEING_PARSED)
6853                                                {
6854                                                    type_sp = type_ptr->shared_from_this();
6855                                                    break;
6856                                                }
6857
6858                                                // FIXME This is fixing some even uglier behavior but we really need to
6859                                                // uniq the methods of each class as well as the class itself.
6860                                                // <rdar://problem/11240464>
6861                                                type_handled = true;
6862                                            }
6863                                        }
6864                                    }
6865                                }
6866                            }
6867                        }
6868
6869                        if (!type_handled)
6870                        {
6871                            // We just have a function that isn't part of a class
6872                            clang::FunctionDecl *function_decl = ast.CreateFunctionDeclaration (ignore_containing_context ? GetClangASTContext().GetTranslationUnitDecl() : containing_decl_ctx,
6873                                                                                                type_name_cstr,
6874                                                                                                clang_type,
6875                                                                                                storage,
6876                                                                                                is_inline);
6877
6878//                            if (template_param_infos.GetSize() > 0)
6879//                            {
6880//                                clang::FunctionTemplateDecl *func_template_decl = ast.CreateFunctionTemplateDecl (containing_decl_ctx,
6881//                                                                                                                  function_decl,
6882//                                                                                                                  type_name_cstr,
6883//                                                                                                                  template_param_infos);
6884//
6885//                                ast.CreateFunctionTemplateSpecializationInfo (function_decl,
6886//                                                                              func_template_decl,
6887//                                                                              template_param_infos);
6888//                            }
6889                            // Add the decl to our DIE to decl context map
6890                            assert (function_decl);
6891                            LinkDeclContextToDIE(function_decl, die);
6892                            if (!function_param_decls.empty())
6893                                ast.SetFunctionParameters (function_decl,
6894                                                           &function_param_decls.front(),
6895                                                           function_param_decls.size());
6896
6897                            ClangASTMetadata metadata;
6898                            metadata.SetUserID(MakeUserID(die->GetOffset()));
6899
6900                            if (!object_pointer_name.empty())
6901                            {
6902                                metadata.SetObjectPtrName(object_pointer_name.c_str());
6903                                if (log)
6904                                    log->Printf ("Setting object pointer name: %s on function object %p.",
6905                                                 object_pointer_name.c_str(),
6906                                                function_decl);
6907                            }
6908                            GetClangASTContext().SetMetadata (function_decl, metadata);
6909                        }
6910                    }
6911                    type_sp.reset( new Type (MakeUserID(die->GetOffset()),
6912                                             this,
6913                                             type_name_const_str,
6914                                             0,
6915                                             NULL,
6916                                             LLDB_INVALID_UID,
6917                                             Type::eEncodingIsUID,
6918                                             &decl,
6919                                             clang_type,
6920                                             Type::eResolveStateFull));
6921                    assert(type_sp.get());
6922                }
6923                break;
6924
6925            case DW_TAG_array_type:
6926                {
6927                    // Set a bit that lets us know that we are currently parsing this
6928                    m_die_to_type[die] = DIE_IS_BEING_PARSED;
6929
6930                    lldb::user_id_t type_die_offset = DW_INVALID_OFFSET;
6931                    int64_t first_index = 0;
6932                    uint32_t byte_stride = 0;
6933                    uint32_t bit_stride = 0;
6934                    bool is_vector = false;
6935                    const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes);
6936
6937                    if (num_attributes > 0)
6938                    {
6939                        uint32_t i;
6940                        for (i=0; i<num_attributes; ++i)
6941                        {
6942                            attr = attributes.AttributeAtIndex(i);
6943                            DWARFFormValue form_value;
6944                            if (attributes.ExtractFormValueAtIndex(this, i, form_value))
6945                            {
6946                                switch (attr)
6947                                {
6948                                case DW_AT_decl_file:   decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break;
6949                                case DW_AT_decl_line:   decl.SetLine(form_value.Unsigned()); break;
6950                                case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
6951                                case DW_AT_name:
6952                                    type_name_cstr = form_value.AsCString(&get_debug_str_data());
6953                                    type_name_const_str.SetCString(type_name_cstr);
6954                                    break;
6955
6956                                case DW_AT_type:            type_die_offset = form_value.Reference(dwarf_cu); break;
6957                                case DW_AT_byte_size:       break; // byte_size = form_value.Unsigned(); break;
6958                                case DW_AT_byte_stride:     byte_stride = form_value.Unsigned(); break;
6959                                case DW_AT_bit_stride:      bit_stride = form_value.Unsigned(); break;
6960                                case DW_AT_GNU_vector:      is_vector = form_value.Boolean(); break;
6961                                case DW_AT_accessibility:   break; // accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
6962                                case DW_AT_declaration:     break; // is_forward_declaration = form_value.Boolean(); break;
6963                                case DW_AT_allocated:
6964                                case DW_AT_associated:
6965                                case DW_AT_data_location:
6966                                case DW_AT_description:
6967                                case DW_AT_ordering:
6968                                case DW_AT_start_scope:
6969                                case DW_AT_visibility:
6970                                case DW_AT_specification:
6971                                case DW_AT_abstract_origin:
6972                                case DW_AT_sibling:
6973                                    break;
6974                                }
6975                            }
6976                        }
6977
6978                        DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", MakeUserID(die->GetOffset()), DW_TAG_value_to_name(tag), type_name_cstr);
6979
6980                        Type *element_type = ResolveTypeUID(type_die_offset);
6981
6982                        if (element_type)
6983                        {
6984                            std::vector<uint64_t> element_orders;
6985                            ParseChildArrayInfo(sc, dwarf_cu, die, first_index, element_orders, byte_stride, bit_stride);
6986                            if (byte_stride == 0 && bit_stride == 0)
6987                                byte_stride = element_type->GetByteSize();
6988                            ClangASTType array_element_type = element_type->GetClangForwardType();
6989                            uint64_t array_element_bit_stride = byte_stride * 8 + bit_stride;
6990                            uint64_t num_elements = 0;
6991                            std::vector<uint64_t>::const_reverse_iterator pos;
6992                            std::vector<uint64_t>::const_reverse_iterator end = element_orders.rend();
6993                            for (pos = element_orders.rbegin(); pos != end; ++pos)
6994                            {
6995                                num_elements = *pos;
6996                                clang_type = ast.CreateArrayType (array_element_type,
6997                                                                  num_elements,
6998                                                                  is_vector);
6999                                array_element_type = clang_type;
7000                                array_element_bit_stride = num_elements ? array_element_bit_stride * num_elements : array_element_bit_stride;
7001                            }
7002                            ConstString empty_name;
7003                            type_sp.reset( new Type (MakeUserID(die->GetOffset()),
7004                                                     this,
7005                                                     empty_name,
7006                                                     array_element_bit_stride / 8,
7007                                                     NULL,
7008                                                     type_die_offset,
7009                                                     Type::eEncodingIsUID,
7010                                                     &decl,
7011                                                     clang_type,
7012                                                     Type::eResolveStateFull));
7013                            type_sp->SetEncodingType (element_type);
7014                        }
7015                    }
7016                }
7017                break;
7018
7019            case DW_TAG_ptr_to_member_type:
7020                {
7021                    dw_offset_t type_die_offset = DW_INVALID_OFFSET;
7022                    dw_offset_t containing_type_die_offset = DW_INVALID_OFFSET;
7023
7024                    const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes);
7025
7026                    if (num_attributes > 0) {
7027                        uint32_t i;
7028                        for (i=0; i<num_attributes; ++i)
7029                        {
7030                            attr = attributes.AttributeAtIndex(i);
7031                            DWARFFormValue form_value;
7032                            if (attributes.ExtractFormValueAtIndex(this, i, form_value))
7033                            {
7034                                switch (attr)
7035                                {
7036                                    case DW_AT_type:
7037                                        type_die_offset = form_value.Reference(dwarf_cu); break;
7038                                    case DW_AT_containing_type:
7039                                        containing_type_die_offset = form_value.Reference(dwarf_cu); break;
7040                                }
7041                            }
7042                        }
7043
7044                        Type *pointee_type = ResolveTypeUID(type_die_offset);
7045                        Type *class_type = ResolveTypeUID(containing_type_die_offset);
7046
7047                        ClangASTType pointee_clang_type = pointee_type->GetClangForwardType();
7048                        ClangASTType class_clang_type = class_type->GetClangLayoutType();
7049
7050                        clang_type = pointee_clang_type.CreateMemberPointerType(class_clang_type);
7051
7052                        byte_size = clang_type.GetByteSize();
7053
7054                        type_sp.reset( new Type (MakeUserID(die->GetOffset()),
7055                                                 this,
7056                                                 type_name_const_str,
7057                                                 byte_size,
7058                                                 NULL,
7059                                                 LLDB_INVALID_UID,
7060                                                 Type::eEncodingIsUID,
7061                                                 NULL,
7062                                                 clang_type,
7063                                                 Type::eResolveStateForward));
7064                    }
7065
7066                    break;
7067                }
7068            default:
7069                GetObjectFile()->GetModule()->ReportError ("{0x%8.8x}: unhandled type tag 0x%4.4x (%s), please file a bug and attach the file at the start of this error message",
7070                                                           die->GetOffset(),
7071                                                           tag,
7072                                                           DW_TAG_value_to_name(tag));
7073                break;
7074            }
7075
7076            if (type_sp.get())
7077            {
7078                const DWARFDebugInfoEntry *sc_parent_die = GetParentSymbolContextDIE(die);
7079                dw_tag_t sc_parent_tag = sc_parent_die ? sc_parent_die->Tag() : 0;
7080
7081                SymbolContextScope * symbol_context_scope = NULL;
7082                if (sc_parent_tag == DW_TAG_compile_unit)
7083                {
7084                    symbol_context_scope = sc.comp_unit;
7085                }
7086                else if (sc.function != NULL)
7087                {
7088                    symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(MakeUserID(sc_parent_die->GetOffset()));
7089                    if (symbol_context_scope == NULL)
7090                        symbol_context_scope = sc.function;
7091                }
7092
7093                if (symbol_context_scope != NULL)
7094                {
7095                    type_sp->SetSymbolContextScope(symbol_context_scope);
7096                }
7097
7098                // We are ready to put this type into the uniqued list up at the module level
7099                type_list->Insert (type_sp);
7100
7101                m_die_to_type[die] = type_sp.get();
7102            }
7103        }
7104        else if (type_ptr != DIE_IS_BEING_PARSED)
7105        {
7106            type_sp = type_ptr->shared_from_this();
7107        }
7108    }
7109    return type_sp;
7110}
7111
7112size_t
7113SymbolFileDWARF::ParseTypes
7114(
7115    const SymbolContext& sc,
7116    DWARFCompileUnit* dwarf_cu,
7117    const DWARFDebugInfoEntry *die,
7118    bool parse_siblings,
7119    bool parse_children
7120)
7121{
7122    size_t types_added = 0;
7123    while (die != NULL)
7124    {
7125        bool type_is_new = false;
7126        if (ParseType(sc, dwarf_cu, die, &type_is_new).get())
7127        {
7128            if (type_is_new)
7129                ++types_added;
7130        }
7131
7132        if (parse_children && die->HasChildren())
7133        {
7134            if (die->Tag() == DW_TAG_subprogram)
7135            {
7136                SymbolContext child_sc(sc);
7137                child_sc.function = sc.comp_unit->FindFunctionByUID(MakeUserID(die->GetOffset())).get();
7138                types_added += ParseTypes(child_sc, dwarf_cu, die->GetFirstChild(), true, true);
7139            }
7140            else
7141                types_added += ParseTypes(sc, dwarf_cu, die->GetFirstChild(), true, true);
7142        }
7143
7144        if (parse_siblings)
7145            die = die->GetSibling();
7146        else
7147            die = NULL;
7148    }
7149    return types_added;
7150}
7151
7152
7153size_t
7154SymbolFileDWARF::ParseFunctionBlocks (const SymbolContext &sc)
7155{
7156    assert(sc.comp_unit && sc.function);
7157    size_t functions_added = 0;
7158    DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
7159    if (dwarf_cu)
7160    {
7161        dw_offset_t function_die_offset = sc.function->GetID();
7162        const DWARFDebugInfoEntry *function_die = dwarf_cu->GetDIEPtr(function_die_offset);
7163        if (function_die)
7164        {
7165            ParseFunctionBlocks(sc, &sc.function->GetBlock (false), dwarf_cu, function_die, LLDB_INVALID_ADDRESS, 0);
7166        }
7167    }
7168
7169    return functions_added;
7170}
7171
7172
7173size_t
7174SymbolFileDWARF::ParseTypes (const SymbolContext &sc)
7175{
7176    // At least a compile unit must be valid
7177    assert(sc.comp_unit);
7178    size_t types_added = 0;
7179    DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
7180    if (dwarf_cu)
7181    {
7182        if (sc.function)
7183        {
7184            dw_offset_t function_die_offset = sc.function->GetID();
7185            const DWARFDebugInfoEntry *func_die = dwarf_cu->GetDIEPtr(function_die_offset);
7186            if (func_die && func_die->HasChildren())
7187            {
7188                types_added = ParseTypes(sc, dwarf_cu, func_die->GetFirstChild(), true, true);
7189            }
7190        }
7191        else
7192        {
7193            const DWARFDebugInfoEntry *dwarf_cu_die = dwarf_cu->DIE();
7194            if (dwarf_cu_die && dwarf_cu_die->HasChildren())
7195            {
7196                types_added = ParseTypes(sc, dwarf_cu, dwarf_cu_die->GetFirstChild(), true, true);
7197            }
7198        }
7199    }
7200
7201    return types_added;
7202}
7203
7204size_t
7205SymbolFileDWARF::ParseVariablesForContext (const SymbolContext& sc)
7206{
7207    if (sc.comp_unit != NULL)
7208    {
7209        DWARFDebugInfo* info = DebugInfo();
7210        if (info == NULL)
7211            return 0;
7212
7213        if (sc.function)
7214        {
7215            DWARFCompileUnit* dwarf_cu = info->GetCompileUnitContainingDIE(sc.function->GetID()).get();
7216
7217            if (dwarf_cu == NULL)
7218                return 0;
7219
7220            const DWARFDebugInfoEntry *function_die = dwarf_cu->GetDIEPtr(sc.function->GetID());
7221
7222            dw_addr_t func_lo_pc = function_die->GetAttributeValueAsUnsigned (this, dwarf_cu, DW_AT_low_pc, LLDB_INVALID_ADDRESS);
7223            if (func_lo_pc != LLDB_INVALID_ADDRESS)
7224            {
7225                const size_t num_variables = ParseVariables(sc, dwarf_cu, func_lo_pc, function_die->GetFirstChild(), true, true);
7226
7227                // Let all blocks know they have parse all their variables
7228                sc.function->GetBlock (false).SetDidParseVariables (true, true);
7229                return num_variables;
7230            }
7231        }
7232        else if (sc.comp_unit)
7233        {
7234            DWARFCompileUnit* dwarf_cu = info->GetCompileUnit(sc.comp_unit->GetID()).get();
7235
7236            if (dwarf_cu == NULL)
7237                return 0;
7238
7239            uint32_t vars_added = 0;
7240            VariableListSP variables (sc.comp_unit->GetVariableList(false));
7241
7242            if (variables.get() == NULL)
7243            {
7244                variables.reset(new VariableList());
7245                sc.comp_unit->SetVariableList(variables);
7246
7247                DWARFCompileUnit* match_dwarf_cu = NULL;
7248                const DWARFDebugInfoEntry* die = NULL;
7249                DIEArray die_offsets;
7250                if (m_using_apple_tables)
7251                {
7252                    if (m_apple_names_ap.get())
7253                    {
7254                        DWARFMappedHash::DIEInfoArray hash_data_array;
7255                        if (m_apple_names_ap->AppendAllDIEsInRange (dwarf_cu->GetOffset(),
7256                                                                    dwarf_cu->GetNextCompileUnitOffset(),
7257                                                                    hash_data_array))
7258                        {
7259                            DWARFMappedHash::ExtractDIEArray (hash_data_array, die_offsets);
7260                        }
7261                    }
7262                }
7263                else
7264                {
7265                    // Index if we already haven't to make sure the compile units
7266                    // get indexed and make their global DIE index list
7267                    if (!m_indexed)
7268                        Index ();
7269
7270                    m_global_index.FindAllEntriesForCompileUnit (dwarf_cu->GetOffset(),
7271                                                                 dwarf_cu->GetNextCompileUnitOffset(),
7272                                                                 die_offsets);
7273                }
7274
7275                const size_t num_matches = die_offsets.size();
7276                if (num_matches)
7277                {
7278                    DWARFDebugInfo* debug_info = DebugInfo();
7279                    for (size_t i=0; i<num_matches; ++i)
7280                    {
7281                        const dw_offset_t die_offset = die_offsets[i];
7282                        die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &match_dwarf_cu);
7283                        if (die)
7284                        {
7285                            VariableSP var_sp (ParseVariableDIE(sc, dwarf_cu, die, LLDB_INVALID_ADDRESS));
7286                            if (var_sp)
7287                            {
7288                                variables->AddVariableIfUnique (var_sp);
7289                                ++vars_added;
7290                            }
7291                        }
7292                        else
7293                        {
7294                            if (m_using_apple_tables)
7295                            {
7296                                GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x)\n", die_offset);
7297                            }
7298                        }
7299
7300                    }
7301                }
7302            }
7303            return vars_added;
7304        }
7305    }
7306    return 0;
7307}
7308
7309
7310VariableSP
7311SymbolFileDWARF::ParseVariableDIE
7312(
7313    const SymbolContext& sc,
7314    DWARFCompileUnit* dwarf_cu,
7315    const DWARFDebugInfoEntry *die,
7316    const lldb::addr_t func_low_pc
7317)
7318{
7319
7320    VariableSP var_sp (m_die_to_variable_sp[die]);
7321    if (var_sp)
7322        return var_sp;  // Already been parsed!
7323
7324    const dw_tag_t tag = die->Tag();
7325    ModuleSP module = GetObjectFile()->GetModule();
7326
7327    if ((tag == DW_TAG_variable) ||
7328        (tag == DW_TAG_constant) ||
7329        (tag == DW_TAG_formal_parameter && sc.function))
7330    {
7331        DWARFDebugInfoEntry::Attributes attributes;
7332        const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes);
7333        if (num_attributes > 0)
7334        {
7335            const char *name = NULL;
7336            const char *mangled = NULL;
7337            Declaration decl;
7338            uint32_t i;
7339            lldb::user_id_t type_uid = LLDB_INVALID_UID;
7340            DWARFExpression location;
7341            bool is_external = false;
7342            bool is_artificial = false;
7343            bool location_is_const_value_data = false;
7344            bool has_explicit_location = false;
7345            //AccessType accessibility = eAccessNone;
7346
7347            for (i=0; i<num_attributes; ++i)
7348            {
7349                dw_attr_t attr = attributes.AttributeAtIndex(i);
7350                DWARFFormValue form_value;
7351                if (attributes.ExtractFormValueAtIndex(this, i, form_value))
7352                {
7353                    switch (attr)
7354                    {
7355                    case DW_AT_decl_file:   decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break;
7356                    case DW_AT_decl_line:   decl.SetLine(form_value.Unsigned()); break;
7357                    case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
7358                    case DW_AT_name:        name = form_value.AsCString(&get_debug_str_data()); break;
7359                    case DW_AT_linkage_name:
7360                    case DW_AT_MIPS_linkage_name: mangled = form_value.AsCString(&get_debug_str_data()); break;
7361                    case DW_AT_type:        type_uid = form_value.Reference(dwarf_cu); break;
7362                    case DW_AT_external:    is_external = form_value.Boolean(); break;
7363                    case DW_AT_const_value:
7364                        // If we have already found a DW_AT_location attribute, ignore this attribute.
7365                        if (!has_explicit_location)
7366                        {
7367                            location_is_const_value_data = true;
7368                            // The constant value will be either a block, a data value or a string.
7369                            const DWARFDataExtractor& debug_info_data = get_debug_info_data();
7370                            if (DWARFFormValue::IsBlockForm(form_value.Form()))
7371                            {
7372                                // Retrieve the value as a block expression.
7373                                uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart();
7374                                uint32_t block_length = form_value.Unsigned();
7375                                location.CopyOpcodeData(module, debug_info_data, block_offset, block_length);
7376                            }
7377                            else if (DWARFFormValue::IsDataForm(form_value.Form()))
7378                            {
7379                                // Retrieve the value as a data expression.
7380                                const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize());
7381                                uint32_t data_offset = attributes.DIEOffsetAtIndex(i);
7382                                uint32_t data_length = fixed_form_sizes[form_value.Form()];
7383                                location.CopyOpcodeData(module, debug_info_data, data_offset, data_length);
7384                            }
7385                            else
7386                            {
7387                                // Retrieve the value as a string expression.
7388                                if (form_value.Form() == DW_FORM_strp)
7389                                {
7390                                    const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize());
7391                                    uint32_t data_offset = attributes.DIEOffsetAtIndex(i);
7392                                    uint32_t data_length = fixed_form_sizes[form_value.Form()];
7393                                    location.CopyOpcodeData(module, debug_info_data, data_offset, data_length);
7394                                }
7395                                else
7396                                {
7397                                    const char *str = form_value.AsCString(&debug_info_data);
7398                                    uint32_t string_offset = str - (const char *)debug_info_data.GetDataStart();
7399                                    uint32_t string_length = strlen(str) + 1;
7400                                    location.CopyOpcodeData(module, debug_info_data, string_offset, string_length);
7401                                }
7402                            }
7403                        }
7404                        break;
7405                    case DW_AT_location:
7406                        {
7407                            location_is_const_value_data = false;
7408                            has_explicit_location = true;
7409                            if (form_value.BlockData())
7410                            {
7411                                const DWARFDataExtractor& debug_info_data = get_debug_info_data();
7412
7413                                uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart();
7414                                uint32_t block_length = form_value.Unsigned();
7415                                location.CopyOpcodeData(module, get_debug_info_data(), block_offset, block_length);
7416                            }
7417                            else
7418                            {
7419                                const DWARFDataExtractor&    debug_loc_data = get_debug_loc_data();
7420                                const dw_offset_t debug_loc_offset = form_value.Unsigned();
7421
7422                                size_t loc_list_length = DWARFLocationList::Size(debug_loc_data, debug_loc_offset);
7423                                if (loc_list_length > 0)
7424                                {
7425                                    location.CopyOpcodeData(module, debug_loc_data, debug_loc_offset, loc_list_length);
7426                                    assert (func_low_pc != LLDB_INVALID_ADDRESS);
7427                                    location.SetLocationListSlide (func_low_pc - dwarf_cu->GetBaseAddress());
7428                                }
7429                            }
7430                        }
7431                        break;
7432
7433                    case DW_AT_artificial:      is_artificial = form_value.Boolean(); break;
7434                    case DW_AT_accessibility:   break; //accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
7435                    case DW_AT_declaration:
7436                    case DW_AT_description:
7437                    case DW_AT_endianity:
7438                    case DW_AT_segment:
7439                    case DW_AT_start_scope:
7440                    case DW_AT_visibility:
7441                    default:
7442                    case DW_AT_abstract_origin:
7443                    case DW_AT_sibling:
7444                    case DW_AT_specification:
7445                        break;
7446                    }
7447                }
7448            }
7449
7450            ValueType scope = eValueTypeInvalid;
7451
7452            const DWARFDebugInfoEntry *sc_parent_die = GetParentSymbolContextDIE(die);
7453            dw_tag_t parent_tag = sc_parent_die ? sc_parent_die->Tag() : 0;
7454            SymbolContextScope * symbol_context_scope = NULL;
7455
7456            // DWARF doesn't specify if a DW_TAG_variable is a local, global
7457            // or static variable, so we have to do a little digging by
7458            // looking at the location of a varaible to see if it contains
7459            // a DW_OP_addr opcode _somewhere_ in the definition. I say
7460            // somewhere because clang likes to combine small global variables
7461            // into the same symbol and have locations like:
7462            // DW_OP_addr(0x1000), DW_OP_constu(2), DW_OP_plus
7463            // So if we don't have a DW_TAG_formal_parameter, we can look at
7464            // the location to see if it contains a DW_OP_addr opcode, and
7465            // then we can correctly classify  our variables.
7466            if (tag == DW_TAG_formal_parameter)
7467                scope = eValueTypeVariableArgument;
7468            else
7469            {
7470                bool op_error = false;
7471                // Check if the location has a DW_OP_addr with any address value...
7472                lldb::addr_t location_DW_OP_addr = LLDB_INVALID_ADDRESS;
7473                if (!location_is_const_value_data)
7474                {
7475                    location_DW_OP_addr = location.GetLocation_DW_OP_addr (0, op_error);
7476                    if (op_error)
7477                    {
7478                        StreamString strm;
7479                        location.DumpLocationForAddress (&strm, eDescriptionLevelFull, 0, 0, NULL);
7480                        GetObjectFile()->GetModule()->ReportError ("0x%8.8x: %s has an invalid location: %s", die->GetOffset(), DW_TAG_value_to_name(die->Tag()), strm.GetString().c_str());
7481                    }
7482                }
7483
7484                if (location_DW_OP_addr != LLDB_INVALID_ADDRESS)
7485                {
7486                    if (is_external)
7487                        scope = eValueTypeVariableGlobal;
7488                    else
7489                        scope = eValueTypeVariableStatic;
7490
7491
7492                    SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile ();
7493
7494                    if (debug_map_symfile)
7495                    {
7496                        // When leaving the DWARF in the .o files on darwin,
7497                        // when we have a global variable that wasn't initialized,
7498                        // the .o file might not have allocated a virtual
7499                        // address for the global variable. In this case it will
7500                        // have created a symbol for the global variable
7501                        // that is undefined/data and external and the value will
7502                        // be the byte size of the variable. When we do the
7503                        // address map in SymbolFileDWARFDebugMap we rely on
7504                        // having an address, we need to do some magic here
7505                        // so we can get the correct address for our global
7506                        // variable. The address for all of these entries
7507                        // will be zero, and there will be an undefined symbol
7508                        // in this object file, and the executable will have
7509                        // a matching symbol with a good address. So here we
7510                        // dig up the correct address and replace it in the
7511                        // location for the variable, and set the variable's
7512                        // symbol context scope to be that of the main executable
7513                        // so the file address will resolve correctly.
7514                        bool linked_oso_file_addr = false;
7515                        if (is_external && location_DW_OP_addr == 0)
7516                        {
7517                            // we have a possible uninitialized extern global
7518                            ConstString const_name(mangled ? mangled : name);
7519                            ObjectFile *debug_map_objfile = debug_map_symfile->GetObjectFile();
7520                            if (debug_map_objfile)
7521                            {
7522                                Symtab *debug_map_symtab = debug_map_objfile->GetSymtab();
7523                                if (debug_map_symtab)
7524                                {
7525                                    Symbol *exe_symbol = debug_map_symtab->FindFirstSymbolWithNameAndType (const_name,
7526                                                                                                           eSymbolTypeData,
7527                                                                                                           Symtab::eDebugYes,
7528                                                                                                           Symtab::eVisibilityExtern);
7529                                    if (exe_symbol)
7530                                    {
7531                                        if (exe_symbol->ValueIsAddress())
7532                                        {
7533                                            const addr_t exe_file_addr = exe_symbol->GetAddress().GetFileAddress();
7534                                            if (exe_file_addr != LLDB_INVALID_ADDRESS)
7535                                            {
7536                                                if (location.Update_DW_OP_addr (exe_file_addr))
7537                                                {
7538                                                    linked_oso_file_addr = true;
7539                                                    symbol_context_scope = exe_symbol;
7540                                                }
7541                                            }
7542                                        }
7543                                    }
7544                                }
7545                            }
7546                        }
7547
7548                        if (!linked_oso_file_addr)
7549                        {
7550                            // The DW_OP_addr is not zero, but it contains a .o file address which
7551                            // needs to be linked up correctly.
7552                            const lldb::addr_t exe_file_addr = debug_map_symfile->LinkOSOFileAddress(this, location_DW_OP_addr);
7553                            if (exe_file_addr != LLDB_INVALID_ADDRESS)
7554                            {
7555                                // Update the file address for this variable
7556                                location.Update_DW_OP_addr (exe_file_addr);
7557                            }
7558                            else
7559                            {
7560                                // Variable didn't make it into the final executable
7561                                return var_sp;
7562                            }
7563                        }
7564                    }
7565                }
7566                else
7567                {
7568                    scope = eValueTypeVariableLocal;
7569                }
7570            }
7571
7572            if (symbol_context_scope == NULL)
7573            {
7574                switch (parent_tag)
7575                {
7576                case DW_TAG_subprogram:
7577                case DW_TAG_inlined_subroutine:
7578                case DW_TAG_lexical_block:
7579                    if (sc.function)
7580                    {
7581                        symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(MakeUserID(sc_parent_die->GetOffset()));
7582                        if (symbol_context_scope == NULL)
7583                            symbol_context_scope = sc.function;
7584                    }
7585                    break;
7586
7587                default:
7588                    symbol_context_scope = sc.comp_unit;
7589                    break;
7590                }
7591            }
7592
7593            if (symbol_context_scope)
7594            {
7595                var_sp.reset (new Variable (MakeUserID(die->GetOffset()),
7596                                            name,
7597                                            mangled,
7598                                            SymbolFileTypeSP (new SymbolFileType(*this, type_uid)),
7599                                            scope,
7600                                            symbol_context_scope,
7601                                            &decl,
7602                                            location,
7603                                            is_external,
7604                                            is_artificial));
7605
7606                var_sp->SetLocationIsConstantValueData (location_is_const_value_data);
7607            }
7608            else
7609            {
7610                // Not ready to parse this variable yet. It might be a global
7611                // or static variable that is in a function scope and the function
7612                // in the symbol context wasn't filled in yet
7613                return var_sp;
7614            }
7615        }
7616        // Cache var_sp even if NULL (the variable was just a specification or
7617        // was missing vital information to be able to be displayed in the debugger
7618        // (missing location due to optimization, etc)) so we don't re-parse
7619        // this DIE over and over later...
7620        m_die_to_variable_sp[die] = var_sp;
7621    }
7622    return var_sp;
7623}
7624
7625
7626const DWARFDebugInfoEntry *
7627SymbolFileDWARF::FindBlockContainingSpecification (dw_offset_t func_die_offset,
7628                                                   dw_offset_t spec_block_die_offset,
7629                                                   DWARFCompileUnit **result_die_cu_handle)
7630{
7631    // Give the concrete function die specified by "func_die_offset", find the
7632    // concrete block whose DW_AT_specification or DW_AT_abstract_origin points
7633    // to "spec_block_die_offset"
7634    DWARFDebugInfo* info = DebugInfo();
7635
7636    const DWARFDebugInfoEntry *die = info->GetDIEPtrWithCompileUnitHint(func_die_offset, result_die_cu_handle);
7637    if (die)
7638    {
7639        assert (*result_die_cu_handle);
7640        return FindBlockContainingSpecification (*result_die_cu_handle, die, spec_block_die_offset, result_die_cu_handle);
7641    }
7642    return NULL;
7643}
7644
7645
7646const DWARFDebugInfoEntry *
7647SymbolFileDWARF::FindBlockContainingSpecification(DWARFCompileUnit* dwarf_cu,
7648                                                  const DWARFDebugInfoEntry *die,
7649                                                  dw_offset_t spec_block_die_offset,
7650                                                  DWARFCompileUnit **result_die_cu_handle)
7651{
7652    if (die)
7653    {
7654        switch (die->Tag())
7655        {
7656        case DW_TAG_subprogram:
7657        case DW_TAG_inlined_subroutine:
7658        case DW_TAG_lexical_block:
7659            {
7660                if (die->GetAttributeValueAsReference (this, dwarf_cu, DW_AT_specification, DW_INVALID_OFFSET) == spec_block_die_offset)
7661                {
7662                    *result_die_cu_handle = dwarf_cu;
7663                    return die;
7664                }
7665
7666                if (die->GetAttributeValueAsReference (this, dwarf_cu, DW_AT_abstract_origin, DW_INVALID_OFFSET) == spec_block_die_offset)
7667                {
7668                    *result_die_cu_handle = dwarf_cu;
7669                    return die;
7670                }
7671            }
7672            break;
7673        }
7674
7675        // Give the concrete function die specified by "func_die_offset", find the
7676        // concrete block whose DW_AT_specification or DW_AT_abstract_origin points
7677        // to "spec_block_die_offset"
7678        for (const DWARFDebugInfoEntry *child_die = die->GetFirstChild(); child_die != NULL; child_die = child_die->GetSibling())
7679        {
7680            const DWARFDebugInfoEntry *result_die = FindBlockContainingSpecification (dwarf_cu,
7681                                                                                      child_die,
7682                                                                                      spec_block_die_offset,
7683                                                                                      result_die_cu_handle);
7684            if (result_die)
7685                return result_die;
7686        }
7687    }
7688
7689    *result_die_cu_handle = NULL;
7690    return NULL;
7691}
7692
7693size_t
7694SymbolFileDWARF::ParseVariables
7695(
7696    const SymbolContext& sc,
7697    DWARFCompileUnit* dwarf_cu,
7698    const lldb::addr_t func_low_pc,
7699    const DWARFDebugInfoEntry *orig_die,
7700    bool parse_siblings,
7701    bool parse_children,
7702    VariableList* cc_variable_list
7703)
7704{
7705    if (orig_die == NULL)
7706        return 0;
7707
7708    VariableListSP variable_list_sp;
7709
7710    size_t vars_added = 0;
7711    const DWARFDebugInfoEntry *die = orig_die;
7712    while (die != NULL)
7713    {
7714        dw_tag_t tag = die->Tag();
7715
7716        // Check to see if we have already parsed this variable or constant?
7717        if (m_die_to_variable_sp[die])
7718        {
7719            if (cc_variable_list)
7720                cc_variable_list->AddVariableIfUnique (m_die_to_variable_sp[die]);
7721        }
7722        else
7723        {
7724            // We haven't already parsed it, lets do that now.
7725            if ((tag == DW_TAG_variable) ||
7726                (tag == DW_TAG_constant) ||
7727                (tag == DW_TAG_formal_parameter && sc.function))
7728            {
7729                if (variable_list_sp.get() == NULL)
7730                {
7731                    const DWARFDebugInfoEntry *sc_parent_die = GetParentSymbolContextDIE(orig_die);
7732                    dw_tag_t parent_tag = sc_parent_die ? sc_parent_die->Tag() : 0;
7733                    switch (parent_tag)
7734                    {
7735                        case DW_TAG_compile_unit:
7736                            if (sc.comp_unit != NULL)
7737                            {
7738                                variable_list_sp = sc.comp_unit->GetVariableList(false);
7739                                if (variable_list_sp.get() == NULL)
7740                                {
7741                                    variable_list_sp.reset(new VariableList());
7742                                    sc.comp_unit->SetVariableList(variable_list_sp);
7743                                }
7744                            }
7745                            else
7746                            {
7747                                GetObjectFile()->GetModule()->ReportError ("parent 0x%8.8" PRIx64 " %s with no valid compile unit in symbol context for 0x%8.8" PRIx64 " %s.\n",
7748                                                                           MakeUserID(sc_parent_die->GetOffset()),
7749                                                                           DW_TAG_value_to_name (parent_tag),
7750                                                                           MakeUserID(orig_die->GetOffset()),
7751                                                                           DW_TAG_value_to_name (orig_die->Tag()));
7752                            }
7753                            break;
7754
7755                        case DW_TAG_subprogram:
7756                        case DW_TAG_inlined_subroutine:
7757                        case DW_TAG_lexical_block:
7758                            if (sc.function != NULL)
7759                            {
7760                                // Check to see if we already have parsed the variables for the given scope
7761
7762                                Block *block = sc.function->GetBlock(true).FindBlockByID(MakeUserID(sc_parent_die->GetOffset()));
7763                                if (block == NULL)
7764                                {
7765                                    // This must be a specification or abstract origin with
7766                                    // a concrete block couterpart in the current function. We need
7767                                    // to find the concrete block so we can correctly add the
7768                                    // variable to it
7769                                    DWARFCompileUnit *concrete_block_die_cu = dwarf_cu;
7770                                    const DWARFDebugInfoEntry *concrete_block_die = FindBlockContainingSpecification (sc.function->GetID(),
7771                                                                                                                      sc_parent_die->GetOffset(),
7772                                                                                                                      &concrete_block_die_cu);
7773                                    if (concrete_block_die)
7774                                        block = sc.function->GetBlock(true).FindBlockByID(MakeUserID(concrete_block_die->GetOffset()));
7775                                }
7776
7777                                if (block != NULL)
7778                                {
7779                                    const bool can_create = false;
7780                                    variable_list_sp = block->GetBlockVariableList (can_create);
7781                                    if (variable_list_sp.get() == NULL)
7782                                    {
7783                                        variable_list_sp.reset(new VariableList());
7784                                        block->SetVariableList(variable_list_sp);
7785                                    }
7786                                }
7787                            }
7788                            break;
7789
7790                        default:
7791                             GetObjectFile()->GetModule()->ReportError ("didn't find appropriate parent DIE for variable list for 0x%8.8" PRIx64 " %s.\n",
7792                                                                        MakeUserID(orig_die->GetOffset()),
7793                                                                        DW_TAG_value_to_name (orig_die->Tag()));
7794                            break;
7795                    }
7796                }
7797
7798                if (variable_list_sp)
7799                {
7800                    VariableSP var_sp (ParseVariableDIE(sc, dwarf_cu, die, func_low_pc));
7801                    if (var_sp)
7802                    {
7803                        variable_list_sp->AddVariableIfUnique (var_sp);
7804                        if (cc_variable_list)
7805                            cc_variable_list->AddVariableIfUnique (var_sp);
7806                        ++vars_added;
7807                    }
7808                }
7809            }
7810        }
7811
7812        bool skip_children = (sc.function == NULL && tag == DW_TAG_subprogram);
7813
7814        if (!skip_children && parse_children && die->HasChildren())
7815        {
7816            vars_added += ParseVariables(sc, dwarf_cu, func_low_pc, die->GetFirstChild(), true, true, cc_variable_list);
7817        }
7818
7819        if (parse_siblings)
7820            die = die->GetSibling();
7821        else
7822            die = NULL;
7823    }
7824    return vars_added;
7825}
7826
7827//------------------------------------------------------------------
7828// PluginInterface protocol
7829//------------------------------------------------------------------
7830ConstString
7831SymbolFileDWARF::GetPluginName()
7832{
7833    return GetPluginNameStatic();
7834}
7835
7836uint32_t
7837SymbolFileDWARF::GetPluginVersion()
7838{
7839    return 1;
7840}
7841
7842void
7843SymbolFileDWARF::CompleteTagDecl (void *baton, clang::TagDecl *decl)
7844{
7845    SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton;
7846    ClangASTType clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl);
7847    if (clang_type)
7848        symbol_file_dwarf->ResolveClangOpaqueTypeDefinition (clang_type);
7849}
7850
7851void
7852SymbolFileDWARF::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl)
7853{
7854    SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton;
7855    ClangASTType clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl);
7856    if (clang_type)
7857        symbol_file_dwarf->ResolveClangOpaqueTypeDefinition (clang_type);
7858}
7859
7860void
7861SymbolFileDWARF::DumpIndexes ()
7862{
7863    StreamFile s(stdout, false);
7864
7865    s.Printf ("DWARF index for (%s) '%s':",
7866              GetObjectFile()->GetModule()->GetArchitecture().GetArchitectureName(),
7867              GetObjectFile()->GetFileSpec().GetPath().c_str());
7868    s.Printf("\nFunction basenames:\n");    m_function_basename_index.Dump (&s);
7869    s.Printf("\nFunction fullnames:\n");    m_function_fullname_index.Dump (&s);
7870    s.Printf("\nFunction methods:\n");      m_function_method_index.Dump (&s);
7871    s.Printf("\nFunction selectors:\n");    m_function_selector_index.Dump (&s);
7872    s.Printf("\nObjective C class selectors:\n");    m_objc_class_selectors_index.Dump (&s);
7873    s.Printf("\nGlobals and statics:\n");   m_global_index.Dump (&s);
7874    s.Printf("\nTypes:\n");                 m_type_index.Dump (&s);
7875    s.Printf("\nNamepaces:\n");             m_namespace_index.Dump (&s);
7876}
7877
7878void
7879SymbolFileDWARF::SearchDeclContext (const clang::DeclContext *decl_context,
7880                                    const char *name,
7881                                    llvm::SmallVectorImpl <clang::NamedDecl *> *results)
7882{
7883    DeclContextToDIEMap::iterator iter = m_decl_ctx_to_die.find(decl_context);
7884
7885    if (iter == m_decl_ctx_to_die.end())
7886        return;
7887
7888    for (DIEPointerSet::iterator pos = iter->second.begin(), end = iter->second.end(); pos != end; ++pos)
7889    {
7890        const DWARFDebugInfoEntry *context_die = *pos;
7891
7892        if (!results)
7893            return;
7894
7895        DWARFDebugInfo* info = DebugInfo();
7896
7897        DIEArray die_offsets;
7898
7899        DWARFCompileUnit* dwarf_cu = NULL;
7900        const DWARFDebugInfoEntry* die = NULL;
7901
7902        if (m_using_apple_tables)
7903        {
7904            if (m_apple_types_ap.get())
7905                m_apple_types_ap->FindByName (name, die_offsets);
7906        }
7907        else
7908        {
7909            if (!m_indexed)
7910                Index ();
7911
7912            m_type_index.Find (ConstString(name), die_offsets);
7913        }
7914
7915        const size_t num_matches = die_offsets.size();
7916
7917        if (num_matches)
7918        {
7919            for (size_t i = 0; i < num_matches; ++i)
7920            {
7921                const dw_offset_t die_offset = die_offsets[i];
7922                die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);
7923
7924                if (die->GetParent() != context_die)
7925                    continue;
7926
7927                Type *matching_type = ResolveType (dwarf_cu, die);
7928
7929                clang::QualType qual_type = matching_type->GetClangForwardType().GetQualType();
7930
7931                if (const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr()))
7932                {
7933                    clang::TagDecl *tag_decl = tag_type->getDecl();
7934                    results->push_back(tag_decl);
7935                }
7936                else if (const clang::TypedefType *typedef_type = llvm::dyn_cast<clang::TypedefType>(qual_type.getTypePtr()))
7937                {
7938                    clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
7939                    results->push_back(typedef_decl);
7940                }
7941            }
7942        }
7943    }
7944}
7945
7946void
7947SymbolFileDWARF::FindExternalVisibleDeclsByName (void *baton,
7948                                                 const clang::DeclContext *decl_context,
7949                                                 clang::DeclarationName decl_name,
7950                                                 llvm::SmallVectorImpl <clang::NamedDecl *> *results)
7951{
7952
7953    switch (decl_context->getDeclKind())
7954    {
7955    case clang::Decl::Namespace:
7956    case clang::Decl::TranslationUnit:
7957        {
7958            SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton;
7959            symbol_file_dwarf->SearchDeclContext (decl_context, decl_name.getAsString().c_str(), results);
7960        }
7961        break;
7962    default:
7963        break;
7964    }
7965}
7966
7967bool
7968SymbolFileDWARF::LayoutRecordType (void *baton,
7969                                   const clang::RecordDecl *record_decl,
7970                                   uint64_t &size,
7971                                   uint64_t &alignment,
7972                                   llvm::DenseMap <const clang::FieldDecl *, uint64_t> &field_offsets,
7973                                   llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
7974                                   llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets)
7975{
7976    SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton;
7977    return symbol_file_dwarf->LayoutRecordType (record_decl, size, alignment, field_offsets, base_offsets, vbase_offsets);
7978}
7979
7980
7981bool
7982SymbolFileDWARF::LayoutRecordType (const clang::RecordDecl *record_decl,
7983                                   uint64_t &bit_size,
7984                                   uint64_t &alignment,
7985                                   llvm::DenseMap <const clang::FieldDecl *, uint64_t> &field_offsets,
7986                                   llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
7987                                   llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets)
7988{
7989    Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO));
7990    RecordDeclToLayoutMap::iterator pos = m_record_decl_to_layout_map.find (record_decl);
7991    bool success = false;
7992    base_offsets.clear();
7993    vbase_offsets.clear();
7994    if (pos != m_record_decl_to_layout_map.end())
7995    {
7996        bit_size = pos->second.bit_size;
7997        alignment = pos->second.alignment;
7998        field_offsets.swap(pos->second.field_offsets);
7999        base_offsets.swap (pos->second.base_offsets);
8000        vbase_offsets.swap (pos->second.vbase_offsets);
8001        m_record_decl_to_layout_map.erase(pos);
8002        success = true;
8003    }
8004    else
8005    {
8006        bit_size = 0;
8007        alignment = 0;
8008        field_offsets.clear();
8009    }
8010
8011    if (log)
8012        GetObjectFile()->GetModule()->LogMessage (log,
8013                                                  "SymbolFileDWARF::LayoutRecordType (record_decl = %p, bit_size = %" PRIu64 ", alignment = %" PRIu64 ", field_offsets[%u],base_offsets[%u], vbase_offsets[%u]) success = %i",
8014                                                  record_decl,
8015                                                  bit_size,
8016                                                  alignment,
8017                                                  (uint32_t)field_offsets.size(),
8018                                                  (uint32_t)base_offsets.size(),
8019                                                  (uint32_t)vbase_offsets.size(),
8020                                                  success);
8021    return success;
8022}
8023
8024
8025SymbolFileDWARFDebugMap *
8026SymbolFileDWARF::GetDebugMapSymfile ()
8027{
8028    if (m_debug_map_symfile == NULL && !m_debug_map_module_wp.expired())
8029    {
8030        lldb::ModuleSP module_sp (m_debug_map_module_wp.lock());
8031        if (module_sp)
8032        {
8033            SymbolVendor *sym_vendor = module_sp->GetSymbolVendor();
8034            if (sym_vendor)
8035                m_debug_map_symfile = (SymbolFileDWARFDebugMap *)sym_vendor->GetSymbolFile();
8036        }
8037    }
8038    return m_debug_map_symfile;
8039}
8040
8041
8042