diff options
Diffstat (limited to 'lldb/source/Symbol')
| -rw-r--r-- | lldb/source/Symbol/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | lldb/source/Symbol/SymbolContext.cpp | 165 | ||||
| -rw-r--r-- | lldb/source/Symbol/SymbolFile.cpp | 4 | ||||
| -rw-r--r-- | lldb/source/Symbol/SymbolVendor.cpp | 2 | ||||
| -rw-r--r-- | lldb/source/Symbol/TypeList.cpp | 52 | ||||
| -rw-r--r-- | lldb/source/Symbol/TypeMap.cpp | 313 | 
6 files changed, 46 insertions, 491 deletions
diff --git a/lldb/source/Symbol/CMakeLists.txt b/lldb/source/Symbol/CMakeLists.txt index 97f1e0ffb17..b1da6de638c 100644 --- a/lldb/source/Symbol/CMakeLists.txt +++ b/lldb/source/Symbol/CMakeLists.txt @@ -24,7 +24,6 @@ add_lldb_library(lldbSymbol    Symtab.cpp    Type.cpp    TypeList.cpp -  TypeMap.cpp     TypeSystem.cpp    UnwindPlan.cpp    UnwindTable.cpp diff --git a/lldb/source/Symbol/SymbolContext.cpp b/lldb/source/Symbol/SymbolContext.cpp index b9f69bd67db..d66cc700d4c 100644 --- a/lldb/source/Symbol/SymbolContext.cpp +++ b/lldb/source/Symbol/SymbolContext.cpp @@ -659,171 +659,6 @@ SymbolContext::GetFunctionMethodInfo (lldb::LanguageType &language,      return false;  } -class TypeMoveMatchingBlock -{ -public: -	TypeMoveMatchingBlock(Block * block, TypeMap &typem, TypeList &typel) : -		curr_block(block),type_map(typem),type_list(typel) -    { -    } - -    bool -    operator() (const lldb::TypeSP& type) -    { -    	if (type && type->GetSymbolContextScope() != nullptr && curr_block == type->GetSymbolContextScope()->CalculateSymbolContextBlock()) -    	{ -    	   	type_list.Insert(type); -    		type_map.RemoveTypeWithUID(type->GetID()); -    		return false; -    	} -        return true; -    } - -private: -    const Block * const curr_block; -    TypeMap &type_map; -    TypeList &type_list; -}; - -class TypeMoveMatchingFunction -{ -public: -	TypeMoveMatchingFunction(Function * block, TypeMap &typem, TypeList &typel) : -		func(block),type_map(typem),type_list(typel) -    { -    } - -    bool -    operator() (const lldb::TypeSP& type) -    { -    	if (type && type->GetSymbolContextScope() != nullptr && func == type->GetSymbolContextScope()->CalculateSymbolContextFunction()) -    	{ -    	    type_list.Insert(type); -    	    type_map.RemoveTypeWithUID(type->GetID()); -    	    return false; -    	} -        return true; -    } - -private: -    const Function * const func; -    TypeMap &type_map; -    TypeList &type_list; -}; - -class TypeMoveMatchingCompileUnit -{ -public: -	TypeMoveMatchingCompileUnit(CompileUnit * cunit, TypeMap &typem, TypeList &typel) : -		comp_unit(cunit),type_map(typem),type_list(typel) -    { -    } - -    bool -    operator() (const lldb::TypeSP& type) -    { -    	if (type && type->GetSymbolContextScope() != nullptr && comp_unit == type->GetSymbolContextScope()->CalculateSymbolContextCompileUnit()) -    	{ -    	    type_list.Insert(type); -    	    type_map.RemoveTypeWithUID(type->GetID()); -    	    return false; -    	} -    	return true; -    } - -private: -    const CompileUnit * const comp_unit; -    TypeMap &type_map; -    TypeList &type_list; -}; - -class TypeMoveMatchingModule -{ -public: -	TypeMoveMatchingModule(lldb::ModuleSP modsp, TypeMap &typem, TypeList &typel) : -		modulesp(modsp),type_map(typem),type_list(typel) -    { -    } - -    bool -    operator() (const lldb::TypeSP& type) -    { -    	if (type && type->GetSymbolContextScope() != nullptr && modulesp.get() == type->GetSymbolContextScope()->CalculateSymbolContextModule().get()) -    	{ -    	    type_list.Insert(type); -    	    type_map.RemoveTypeWithUID(type->GetID()); -    	    return false; -    	} -        return true; -    } - -private: -    lldb::ModuleSP modulesp; -    TypeMap &type_map; -    TypeList &type_list; -}; - -class TypeMaptoList -{ -public: -	TypeMaptoList(TypeMap &typem, TypeList &typel) : -		type_map(typem),type_list(typel) -    { -    } - -    bool -    operator() (const lldb::TypeSP& type) -    { -    	if(type) -    	{ -            type_list.Insert(type); -            type_map.RemoveTypeWithUID(type->GetID()); -    	} -        return true; -    } - -private: -    TypeMap &type_map; -    TypeList &type_list; -}; - -void -SymbolContext::SortTypeList(TypeMap &type_map, TypeList &type_list ) const -{ -	Block * curr_block = block; -    bool isInlinedblock = false; -    if(curr_block != nullptr && curr_block->GetContainingInlinedBlock() != nullptr) -    	isInlinedblock = true; - -	while (curr_block != nullptr && !isInlinedblock) -    { -		TypeMoveMatchingBlock callbackBlock (curr_block, type_map, type_list); -		type_map.ForEach(callbackBlock); -	    curr_block = curr_block->GetParent(); -	} -    if(function != nullptr && type_map.GetSize() > 0) -    { -    	TypeMoveMatchingFunction callbackFunction (function, type_map, type_list); -    	type_map.ForEach(callbackFunction); -    } -    if(comp_unit != nullptr && type_map.GetSize() > 0) -    { -    	TypeMoveMatchingCompileUnit callbackCompileUnit (comp_unit, type_map, type_list); -    	type_map.ForEach(callbackCompileUnit); -    } -    if(module_sp && type_map.GetSize() > 0) -    { -    	TypeMoveMatchingModule callbackModule (module_sp, type_map, type_list); -    	type_map.ForEach(callbackModule); -    } -    if(type_map.GetSize() > 0) -    { -    	TypeMaptoList callbackM2L (type_map, type_list); -    	type_map.ForEach(callbackM2L); -    } -	return ; -} -  ConstString  SymbolContext::GetFunctionName (Mangled::NamePreference preference) const  { diff --git a/lldb/source/Symbol/SymbolFile.cpp b/lldb/source/Symbol/SymbolFile.cpp index 5486468181f..3cb686578d9 100644 --- a/lldb/source/Symbol/SymbolFile.cpp +++ b/lldb/source/Symbol/SymbolFile.cpp @@ -15,7 +15,7 @@  #include "lldb/Core/PluginManager.h"  #include "lldb/Core/StreamString.h"  #include "lldb/Symbol/ObjectFile.h" -#include "lldb/Symbol/TypeMap.h" +#include "lldb/Symbol/TypeList.h"  #include "lldb/Symbol/TypeSystem.h"  #include "lldb/Symbol/VariableList.h" @@ -135,7 +135,7 @@ SymbolFile::FindFunctions (const RegularExpression& regex, bool include_inlines,  }  uint32_t -SymbolFile::FindTypes (const SymbolContext& sc, const ConstString &name, const CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, TypeMap& types) +SymbolFile::FindTypes (const SymbolContext& sc, const ConstString &name, const CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, TypeList& types)  {      if (!append)          types.Clear(); diff --git a/lldb/source/Symbol/SymbolVendor.cpp b/lldb/source/Symbol/SymbolVendor.cpp index 97e2575aaa0..f0b03cf5401 100644 --- a/lldb/source/Symbol/SymbolVendor.cpp +++ b/lldb/source/Symbol/SymbolVendor.cpp @@ -346,7 +346,7 @@ SymbolVendor::FindFunctions(const RegularExpression& regex, bool include_inlines  size_t -SymbolVendor::FindTypes (const SymbolContext& sc, const ConstString &name, const CompilerDeclContext *parent_decl_ctx, bool append, size_t max_matches, TypeMap& types) +SymbolVendor::FindTypes (const SymbolContext& sc, const ConstString &name, const CompilerDeclContext *parent_decl_ctx, bool append, size_t max_matches, TypeList& types)  {      ModuleSP module_sp(GetModule());      if (module_sp) diff --git a/lldb/source/Symbol/TypeList.cpp b/lldb/source/Symbol/TypeList.cpp index f181dd66463..2a8ea521286 100644 --- a/lldb/source/Symbol/TypeList.cpp +++ b/lldb/source/Symbol/TypeList.cpp @@ -42,7 +42,26 @@ TypeList::Insert (const TypeSP& type_sp)  {      // Just push each type on the back for now. We will worry about uniquing later      if (type_sp) -        m_types.push_back(type_sp); +        m_types.insert(std::make_pair(type_sp->GetID(), type_sp)); +} + + +bool +TypeList::InsertUnique (const TypeSP& type_sp) +{ +    if (type_sp) +    { +        user_id_t type_uid = type_sp->GetID(); +        iterator pos, end = m_types.end(); +         +        for (pos = m_types.find(type_uid); pos != end && pos->second->GetID() == type_uid; ++pos) +        { +            if (pos->second.get() == type_sp.get()) +                return false; +        } +    } +    Insert (type_sp); +    return true;  }  //---------------------------------------------------------------------- @@ -97,7 +116,7 @@ TypeList::GetTypeAtIndex(uint32_t idx)      for (pos = m_types.begin(), end = m_types.end(); pos != end; ++pos)      {          if (i == 0) -            return *pos; +            return pos->second;          --i;      }      return TypeSP(); @@ -108,7 +127,7 @@ TypeList::ForEach (std::function <bool(const lldb::TypeSP &type_sp)> const &call  {      for (auto pos = m_types.begin(), end = m_types.end(); pos != end; ++pos)      { -        if (!callback(*pos)) +        if (!callback(pos->second))              break;      }  } @@ -118,17 +137,32 @@ TypeList::ForEach (std::function <bool(lldb::TypeSP &type_sp)> const &callback)  {      for (auto pos = m_types.begin(), end = m_types.end(); pos != end; ++pos)      { -        if (!callback(*pos)) +        if (!callback(pos->second))              break;      }  } + +bool +TypeList::RemoveTypeWithUID (user_id_t uid) +{ +    iterator pos = m_types.find(uid); +     +    if (pos != m_types.end()) +    { +        m_types.erase(pos); +        return true; +    } +    return false; +} + +  void  TypeList::Dump(Stream *s, bool show_context)  {      for (iterator pos = m_types.begin(), end = m_types.end(); pos != end; ++pos)      { -        pos->get()->Dump(s, show_context); +        pos->second->Dump(s, show_context);      }  } @@ -163,7 +197,7 @@ TypeList::RemoveMismatchedTypes (const std::string &type_scope,      for (pos = m_types.begin(); pos != end; ++pos)      { -        Type* the_type = pos->get(); +        Type* the_type = pos->second.get();          bool keep_match = false;          TypeClass match_type_class = eTypeClassAny; @@ -235,7 +269,7 @@ TypeList::RemoveMismatchedTypes (const std::string &type_scope,          if (keep_match)          { -            matching_types.push_back(*pos); +            matching_types.insert (*pos);          }      }      m_types.swap(matching_types); @@ -257,10 +291,10 @@ TypeList::RemoveMismatchedTypes (TypeClass type_class)      for (pos = m_types.begin(); pos != end; ++pos)      { -        Type* the_type = pos->get(); +        Type* the_type = pos->second.get();          TypeClass match_type_class = the_type->GetForwardCompilerType ().GetTypeClass ();          if (match_type_class & type_class) -            matching_types.push_back (*pos); +            matching_types.insert (*pos);      }      m_types.swap(matching_types);  } diff --git a/lldb/source/Symbol/TypeMap.cpp b/lldb/source/Symbol/TypeMap.cpp deleted file mode 100644 index ce450310b1e..00000000000 --- a/lldb/source/Symbol/TypeMap.cpp +++ /dev/null @@ -1,313 +0,0 @@ -//===-- TypeMap.cpp --------------------------------------------*- C++ -*-===// -// -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - - -// C Includes -// C++ Includes -#include <vector> - -// Other libraries and framework includes -#include "clang/AST/ASTConsumer.h" -#include "clang/AST/ASTContext.h" -#include "clang/AST/Decl.h" -#include "clang/AST/DeclCXX.h" -#include "clang/AST/DeclGroup.h" - -#include "clang/Basic/Builtins.h" -#include "clang/Basic/IdentifierTable.h" -#include "clang/Basic/LangOptions.h" -#include "clang/Basic/SourceManager.h" -#include "clang/Basic/TargetInfo.h" - -#include "llvm/Support/FormattedStream.h" -#include "llvm/Support/raw_ostream.h" - -// Project includes -#include "lldb/Symbol/SymbolFile.h" -#include "lldb/Symbol/SymbolVendor.h" -#include "lldb/Symbol/Type.h" -#include "lldb/Symbol/TypeMap.h" - -using namespace lldb; -using namespace lldb_private; -using namespace clang; - -TypeMap::TypeMap() : -    m_types () -{ -} - -//---------------------------------------------------------------------- -// Destructor -//---------------------------------------------------------------------- -TypeMap::~TypeMap() -{ -} - -void -TypeMap::Insert (const TypeSP& type_sp) -{ -    // Just push each type on the back for now. We will worry about uniquing later -    if (type_sp) -        m_types.insert(std::make_pair(type_sp->GetID(), type_sp)); -} - - -bool -TypeMap::InsertUnique (const TypeSP& type_sp) -{ -    if (type_sp) -    { -        user_id_t type_uid = type_sp->GetID(); -        iterator pos, end = m_types.end(); -         -        for (pos = m_types.find(type_uid); pos != end && pos->second->GetID() == type_uid; ++pos) -        { -            if (pos->second.get() == type_sp.get()) -                return false; -        } -    } -    Insert (type_sp); -    return true; -} - -//---------------------------------------------------------------------- -// Find a base type by its unique ID. -//---------------------------------------------------------------------- -//TypeSP -//TypeMap::FindType(lldb::user_id_t uid) -//{ -//    iterator pos = m_types.find(uid); -//    if (pos != m_types.end()) -//        return pos->second; -//    return TypeSP(); -//} - -//---------------------------------------------------------------------- -// Find a type by name. -//---------------------------------------------------------------------- -//TypeMap -//TypeMap::FindTypes (const ConstString &name) -//{ -//    // Do we ever need to make a lookup by name map? Here we are doing -//    // a linear search which isn't going to be fast. -//    TypeMap types(m_ast.getTargetInfo()->getTriple().getTriple().c_str()); -//    iterator pos, end; -//    for (pos = m_types.begin(), end = m_types.end(); pos != end; ++pos) -//        if (pos->second->GetName() == name) -//            types.Insert (pos->second); -//    return types; -//} - -void -TypeMap::Clear() -{ -    m_types.clear(); -} - -uint32_t -TypeMap::GetSize() const -{ -    return m_types.size(); -} - -// GetTypeAtIndex isn't used a lot for large type lists, currently only for -// type lists that are returned for "image dump -t TYPENAME" commands and other -// simple symbol queries that grab the first result... - -TypeSP -TypeMap::GetTypeAtIndex(uint32_t idx) -{ -    iterator pos, end; -    uint32_t i = idx; -    for (pos = m_types.begin(), end = m_types.end(); pos != end; ++pos) -    { -        if (i == 0) -            return pos->second; -        --i; -    } -    return TypeSP(); -} - -void -TypeMap::ForEach (std::function <bool(const lldb::TypeSP &type_sp)> const &callback) const -{ -    for (auto pos = m_types.begin(), end = m_types.end(); pos != end; ++pos) -    { -        if (!callback(pos->second)) -            break; -    } -} - -void -TypeMap::ForEach (std::function <bool(lldb::TypeSP &type_sp)> const &callback) -{ -    for (auto pos = m_types.begin(), end = m_types.end(); pos != end; ++pos) -    { -        if (!callback(pos->second)) -            break; -    } -} - - -bool -TypeMap::RemoveTypeWithUID (user_id_t uid) -{ -    iterator pos = m_types.find(uid); -     -    if (pos != m_types.end()) -    { -        m_types.erase(pos); -        return true; -    } -    return false; -} - - -void -TypeMap::Dump(Stream *s, bool show_context) -{ -    for (iterator pos = m_types.begin(), end = m_types.end(); pos != end; ++pos) -    { -        pos->second->Dump(s, show_context); -    } -} - -void -TypeMap::RemoveMismatchedTypes (const char *qualified_typename, -                                 bool exact_match) -{ -    std::string type_scope; -    std::string type_basename; -    TypeClass type_class = eTypeClassAny; -    if (!Type::GetTypeScopeAndBasename (qualified_typename, type_scope, type_basename, type_class)) -    { -        type_basename = qualified_typename; -        type_scope.clear(); -    } -    return RemoveMismatchedTypes (type_scope, type_basename, type_class, exact_match); -} - -void -TypeMap::RemoveMismatchedTypes (const std::string &type_scope, -                                 const std::string &type_basename, -                                 TypeClass type_class, -                                 bool exact_match) -{ -    // Our "collection" type currently is a std::map which doesn't -    // have any good way to iterate and remove items from the map -    // so we currently just make a new list and add all of the matching -    // types to it, and then swap it into m_types at the end -    collection matching_types; - -    iterator pos, end = m_types.end(); -     -    for (pos = m_types.begin(); pos != end; ++pos) -    { -        Type* the_type = pos->second.get(); -        bool keep_match = false; -        TypeClass match_type_class = eTypeClassAny; - -        if (type_class != eTypeClassAny) -        { -            match_type_class = the_type->GetForwardCompilerType ().GetTypeClass (); -            if ((match_type_class & type_class) == 0) -                continue; -        } - -        ConstString match_type_name_const_str (the_type->GetQualifiedName()); -        if (match_type_name_const_str) -        { -            const char *match_type_name = match_type_name_const_str.GetCString(); -            std::string match_type_scope; -            std::string match_type_basename; -            if (Type::GetTypeScopeAndBasename (match_type_name, -                                               match_type_scope, -                                               match_type_basename, -                                               match_type_class)) -            { -                if (match_type_basename == type_basename) -                { -                    const size_t type_scope_size = type_scope.size(); -                    const size_t match_type_scope_size = match_type_scope.size(); -                    if (exact_match || (type_scope_size == match_type_scope_size)) -                    { -                        keep_match = match_type_scope == type_scope; -                    } -                    else -                    { -                        if (match_type_scope_size > type_scope_size) -                        { -                            const size_t type_scope_pos = match_type_scope.rfind(type_scope); -                            if (type_scope_pos == match_type_scope_size - type_scope_size) -                            { -                                if (type_scope_pos >= 2) -                                { -                                    // Our match scope ends with the type scope we were looking for, -                                    // but we need to make sure what comes before the matching -                                    // type scope is a namespace boundary in case we are trying to match: -                                    // type_basename = "d" -                                    // type_scope = "b::c::" -                                    // We want to match: -                                    //  match_type_scope "a::b::c::" -                                    // But not: -                                    //  match_type_scope "a::bb::c::" -                                    // So below we make sure what comes before "b::c::" in match_type_scope -                                    // is "::", or the namespace boundary -                                    if (match_type_scope[type_scope_pos - 1] == ':' && -                                        match_type_scope[type_scope_pos - 2] == ':') -                                    { -                                        keep_match = true; -                                    } -                                } -                            } -                        } -                    } -                } -            } -            else -            { -                // The type we are currently looking at doesn't exists -                // in a namespace or class, so it only matches if there -                // is no type scope... -                keep_match = type_scope.empty() && type_basename.compare(match_type_name) == 0; -            } -        } -         -        if (keep_match) -        { -            matching_types.insert (*pos); -        } -    } -    m_types.swap(matching_types); -} - -void -TypeMap::RemoveMismatchedTypes (TypeClass type_class) -{ -    if (type_class == eTypeClassAny) -        return; - -    // Our "collection" type currently is a std::map which doesn't -    // have any good way to iterate and remove items from the map -    // so we currently just make a new list and add all of the matching -    // types to it, and then swap it into m_types at the end -    collection matching_types; -     -    iterator pos, end = m_types.end(); -     -    for (pos = m_types.begin(); pos != end; ++pos) -    { -        Type* the_type = pos->second.get(); -        TypeClass match_type_class = the_type->GetForwardCompilerType ().GetTypeClass (); -        if (match_type_class & type_class) -            matching_types.insert (*pos); -    } -    m_types.swap(matching_types); -}  | 

