diff options
Diffstat (limited to 'source/Plugins/SymbolFile')
| -rw-r--r-- | source/Plugins/SymbolFile/DWARF/DIERef.h | 12 | ||||
| -rw-r--r-- | source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp | 2 | ||||
| -rw-r--r-- | source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 69 | ||||
| -rw-r--r-- | source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h | 7 | 
4 files changed, 83 insertions, 7 deletions
| diff --git a/source/Plugins/SymbolFile/DWARF/DIERef.h b/source/Plugins/SymbolFile/DWARF/DIERef.h index a5484db6bd6c..3df07d511749 100644 --- a/source/Plugins/SymbolFile/DWARF/DIERef.h +++ b/source/Plugins/SymbolFile/DWARF/DIERef.h @@ -33,6 +33,18 @@ struct DIERef      lldb::user_id_t      GetUID() const; +    bool +    operator< (const DIERef &ref) const +    { +        return die_offset < ref.die_offset; +    } + +    bool +    operator< (const DIERef &ref) +    { +        return die_offset < ref.die_offset; +    } +      dw_offset_t cu_offset;      dw_offset_t die_offset;  }; diff --git a/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp index 68a0285b69df..74b54d614aa2 100644 --- a/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ b/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -2928,7 +2928,7 @@ DWARFASTParserClang::ParseChildMembers (const SymbolContext& sc,                                          if (member_byte_offset >= parent_byte_size)                                          { -                                            if (member_array_size != 1) +                                            if (member_array_size != 1 && (member_array_size != 0 || member_byte_offset > parent_byte_size))                                              {                                                  module_sp->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,                                                                          die.GetID(), diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 0ed4d05be5c2..2088864bf6b1 100644 --- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -1065,12 +1065,17 @@ SymbolFileDWARF::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpec              const char * cu_comp_dir = resolveCompDir(cu_die.GetAttributeValueAsString(DW_AT_comp_dir, nullptr));              const dw_offset_t stmt_list = cu_die.GetAttributeValueAsUnsigned(DW_AT_stmt_list, DW_INVALID_OFFSET); - -            // All file indexes in DWARF are one based and a file of index zero is -            // supposed to be the compile unit itself. -            support_files.Append (*sc.comp_unit); - -            return DWARFDebugLine::ParseSupportFiles(sc.comp_unit->GetModule(), get_debug_line_data(), cu_comp_dir, stmt_list, support_files); +            if (stmt_list != DW_INVALID_OFFSET) +            { +                // All file indexes in DWARF are one based and a file of index zero is +                // supposed to be the compile unit itself. +                support_files.Append (*sc.comp_unit); +                return DWARFDebugLine::ParseSupportFiles(sc.comp_unit->GetModule(), +                                                         get_debug_line_data(), +                                                         cu_comp_dir, +                                                         stmt_list, +                                                         support_files); +            }          }      }      return false; @@ -2927,6 +2932,40 @@ SymbolFileDWARF::FindFunctions(const RegularExpression& regex, bool include_inli      return sc_list.GetSize() - original_size;  } +void +SymbolFileDWARF::GetMangledNamesForFunction (const std::string &scope_qualified_name, +                                             std::vector<ConstString> &mangled_names) +{ +    DWARFDebugInfo* info = DebugInfo(); +    uint32_t num_comp_units = 0; +    if (info) +        num_comp_units = info->GetNumCompileUnits(); + +    for (uint32_t i = 0; i < num_comp_units; i++) +    { +        DWARFCompileUnit *cu = info->GetCompileUnitAtIndex(i); +        if (cu == nullptr) +            continue; + +        SymbolFileDWARFDwo *dwo = cu->GetDwoSymbolFile(); +        if (dwo) +            dwo->GetMangledNamesForFunction(scope_qualified_name, mangled_names); +    } + +    NameToOffsetMap::iterator iter = m_function_scope_qualified_name_map.find(scope_qualified_name); +    if (iter == m_function_scope_qualified_name_map.end()) +        return; + +    DIERefSetSP set_sp = (*iter).second; +    std::set<DIERef>::iterator set_iter; +    for (set_iter = set_sp->begin(); set_iter != set_sp->end(); set_iter++) +    { +        DWARFDIE die = DebugInfo()->GetDIE (*set_iter); +        mangled_names.push_back(ConstString(die.GetMangledName())); +    } +} + +  uint32_t  SymbolFileDWARF::FindTypes (const SymbolContext& sc,                               const ConstString &name,  @@ -3751,6 +3790,24 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, const DWARFDIE &die, bool *                      TypeList* type_list = GetTypeList();                      if (type_list)                          type_list->Insert(type_sp); + +                    if (die.Tag() == DW_TAG_subprogram) +                    { +                        DIERef die_ref = die.GetDIERef(); +                        std::string scope_qualified_name(GetDeclContextForUID(die.GetID()).GetScopeQualifiedName().AsCString("")); +                        if (scope_qualified_name.size()) +                        { +                            NameToOffsetMap::iterator iter = m_function_scope_qualified_name_map.find(scope_qualified_name); +                            if (iter != m_function_scope_qualified_name_map.end()) +                                (*iter).second->insert(die_ref); +                            else +                            { +                                DIERefSetSP new_set(new std::set<DIERef>); +                                new_set->insert(die_ref); +                                m_function_scope_qualified_name_map.emplace(std::make_pair(scope_qualified_name, new_set)); +                            } +                        } +                    }                  }              }          } diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index c2e78a417b7a..be097595346e 100644 --- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -208,6 +208,10 @@ public:                     bool append,                     lldb_private::SymbolContextList& sc_list) override; +    void +    GetMangledNamesForFunction (const std::string &scope_qualified_name, +                                std::vector<lldb_private::ConstString> &mangled_names) override; +      uint32_t      FindTypes (const lldb_private::SymbolContext& sc,                 const lldb_private::ConstString &name, @@ -577,6 +581,9 @@ protected:                                          m_fetched_external_modules:1;      lldb_private::LazyBool              m_supports_DW_AT_APPLE_objc_complete_type; +    typedef std::shared_ptr<std::set<DIERef> > DIERefSetSP; +    typedef std::unordered_map<std::string, DIERefSetSP> NameToOffsetMap; +    NameToOffsetMap m_function_scope_qualified_name_map;      std::unique_ptr<DWARFDebugRanges>     m_ranges;      UniqueDWARFASTTypeMap m_unique_ast_type_map;      DIEToTypePtr m_die_to_type; | 
