diff options
author | Enrico Granata <egranata@apple.com> | 2015-09-23 19:32:56 +0000 |
---|---|---|
committer | Enrico Granata <egranata@apple.com> | 2015-09-23 19:32:56 +0000 |
commit | e5ffa089cc88fc730b005d1dba9cb57857a9ba66 (patch) | |
tree | f83c4537137c47e012b056e6f255f4cbf4302407 /lldb | |
parent | cac0b89289c370a24101c657b1345cc0ed57ee9d (diff) | |
download | bcm5719-llvm-e5ffa089cc88fc730b005d1dba9cb57857a9ba66.tar.gz bcm5719-llvm-e5ffa089cc88fc730b005d1dba9cb57857a9ba66.zip |
Revert 248366 "Testcase and fix for bug 24074"
This commit introduced regressions in several test cases on FreeBSD and Mac OS X
llvm-svn: 248421
Diffstat (limited to 'lldb')
23 files changed, 74 insertions, 755 deletions
diff --git a/lldb/include/lldb/Core/Module.h b/lldb/include/lldb/Core/Module.h index 0d3ff60a092..cc44cfcca2b 100644 --- a/lldb/include/lldb/Core/Module.h +++ b/lldb/include/lldb/Core/Module.h @@ -1193,7 +1193,7 @@ private: const CompilerDeclContext *parent_decl_ctx, bool append, size_t max_matches, - TypeMap& types); + TypeList& types); DISALLOW_COPY_AND_ASSIGN (Module); diff --git a/lldb/include/lldb/Symbol/SymbolContext.h b/lldb/include/lldb/Symbol/SymbolContext.h index 7ce95f2f2c9..c48505e1064 100644 --- a/lldb/include/lldb/Symbol/SymbolContext.h +++ b/lldb/include/lldb/Symbol/SymbolContext.h @@ -299,27 +299,6 @@ public: ConstString &language_object_name); //------------------------------------------------------------------ - /// If this symbol context represents a function that is a method, - /// return true and provide information about the method. - /// - /// @param[out] language - /// If \b true is returned, the language for the method. - /// - /// @param[out] is_instance_method - /// If \b true is returned, \b true if this is a instance method, - /// \b false if this is a static/class function. - /// - /// @param[out] language_object_name - /// If \b true is returned, the name of the artificial variable - /// for the language ("this" for C++, "self" for ObjC). - /// - /// @return - /// \b True if this symbol context represents a function that - /// is a method of a class, \b false otherwise. - //------------------------------------------------------------------ - void - SortTypeList(TypeMap &type_map, TypeList &type_list) const; - //------------------------------------------------------------------ /// Find a name of the innermost function for the symbol context. /// /// For instance, if the symbol context contains an inlined block, diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h index d37a2e49ede..94cf403d33f 100644 --- a/lldb/include/lldb/Symbol/SymbolFile.h +++ b/lldb/include/lldb/Symbol/SymbolFile.h @@ -141,7 +141,7 @@ public: virtual uint32_t FindGlobalVariables (const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables); virtual uint32_t FindFunctions (const ConstString &name, const CompilerDeclContext *parent_decl_ctx, uint32_t name_type_mask, bool include_inlines, bool append, SymbolContextList& sc_list); virtual uint32_t FindFunctions (const RegularExpression& regex, bool include_inlines, bool append, SymbolContextList& sc_list); - virtual uint32_t FindTypes (const SymbolContext& sc, const ConstString &name, const CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, TypeMap& types); + virtual uint32_t FindTypes (const SymbolContext& sc, const ConstString &name, const CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, TypeList& types); // virtual uint32_t FindTypes (const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, TypeList& types) = 0; virtual TypeList * GetTypeList (); virtual size_t GetTypes (lldb_private::SymbolContextScope *sc_scope, diff --git a/lldb/include/lldb/Symbol/SymbolVendor.h b/lldb/include/lldb/Symbol/SymbolVendor.h index e57e8e3d050..4d5157378d7 100644 --- a/lldb/include/lldb/Symbol/SymbolVendor.h +++ b/lldb/include/lldb/Symbol/SymbolVendor.h @@ -16,7 +16,6 @@ #include "lldb/Core/ModuleChild.h" #include "lldb/Core/PluginInterface.h" #include "lldb/Symbol/TypeList.h" -#include "lldb/Symbol/TypeMap.h" namespace lldb_private { @@ -126,7 +125,7 @@ public: const CompilerDeclContext *parent_decl_ctx, bool append, size_t max_matches, - TypeMap& types); + TypeList& types); virtual CompilerDeclContext FindNamespace (const SymbolContext& sc, diff --git a/lldb/include/lldb/Symbol/TypeList.h b/lldb/include/lldb/Symbol/TypeList.h index f3642576ddc..4f3f2c9bdbe 100644 --- a/lldb/include/lldb/Symbol/TypeList.h +++ b/lldb/include/lldb/Symbol/TypeList.h @@ -13,7 +13,7 @@ #include "lldb/lldb-private.h" #include "lldb/Symbol/Type.h" #include "lldb/Utility/Iterable.h" -#include <vector> +#include <map> #include <functional> namespace lldb_private { @@ -24,7 +24,7 @@ public: //------------------------------------------------------------------ // Constructors and Destructors //------------------------------------------------------------------ - TypeList(); + TypeList(); virtual ~TypeList(); @@ -44,14 +44,17 @@ public: void Insert (const lldb::TypeSP& type); + bool + InsertUnique (const lldb::TypeSP& type); + uint32_t GetSize() const; lldb::TypeSP GetTypeAtIndex(uint32_t idx); - typedef std::vector<lldb::TypeSP> collection; - typedef AdaptedIterable<collection, lldb::TypeSP, vector_adapter> TypeIterable; + typedef std::multimap<lldb::user_id_t, lldb::TypeSP> collection; + typedef AdaptedIterable<collection, lldb::TypeSP, map_adapter> TypeIterable; TypeIterable Types () @@ -65,6 +68,8 @@ public: void ForEach (std::function <bool(lldb::TypeSP &type_sp)> const &callback); + bool + RemoveTypeWithUID (lldb::user_id_t uid); void RemoveMismatchedTypes (const char *qualified_typename, diff --git a/lldb/include/lldb/Symbol/TypeMap.h b/lldb/include/lldb/Symbol/TypeMap.h deleted file mode 100644 index f7141249001..00000000000 --- a/lldb/include/lldb/Symbol/TypeMap.h +++ /dev/null @@ -1,98 +0,0 @@ -//===-- TypeMap.h ----------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef liblldb_TypeMap_h_ -#define liblldb_TypeMap_h_ - -#include "lldb/lldb-private.h" -#include "lldb/Symbol/Type.h" -#include "lldb/Utility/Iterable.h" -#include <map> -#include <functional> - -namespace lldb_private { - -class TypeMap -{ -public: - //------------------------------------------------------------------ - // Constructors and Destructors - //------------------------------------------------------------------ - TypeMap(); - - virtual - ~TypeMap(); - - void - Clear(); - - void - Dump(Stream *s, bool show_context); - -// lldb::TypeSP -// FindType(lldb::user_id_t uid); - - TypeMap - FindTypes(const ConstString &name); - - void - Insert (const lldb::TypeSP& type); - - bool - InsertUnique (const lldb::TypeSP& type); - - uint32_t - GetSize() const; - - lldb::TypeSP - GetTypeAtIndex(uint32_t idx); - - typedef std::multimap<lldb::user_id_t, lldb::TypeSP> collection; - typedef AdaptedIterable<collection, lldb::TypeSP, map_adapter> TypeIterable; - - TypeIterable - Types () - { - return TypeIterable(m_types); - } - - void - ForEach (std::function <bool(const lldb::TypeSP &type_sp)> const &callback) const; - - void - ForEach (std::function <bool(lldb::TypeSP &type_sp)> const &callback); - - bool - RemoveTypeWithUID (lldb::user_id_t uid); - - void - RemoveMismatchedTypes (const char *qualified_typename, - bool exact_match); - - void - RemoveMismatchedTypes (const std::string &type_scope, - const std::string &type_basename, - lldb::TypeClass type_class, - bool exact_match); - - void - RemoveMismatchedTypes (lldb::TypeClass type_class); - -private: - typedef collection::iterator iterator; - typedef collection::const_iterator const_iterator; - - collection m_types; - - DISALLOW_COPY_AND_ASSIGN (TypeMap); -}; - -} // namespace lldb_private - -#endif // liblldb_TypeMap_h_ diff --git a/lldb/include/lldb/lldb-forward.h b/lldb/include/lldb/lldb-forward.h index 1ee617b821a..5dbdccb18dd 100644 --- a/lldb/include/lldb/lldb-forward.h +++ b/lldb/include/lldb/lldb-forward.h @@ -254,7 +254,6 @@ class TypeAndOrName; class TypeCategoryMap; class TypeImpl; class TypeList; -class TypeMap; class TypeListImpl; class TypeMemberImpl; class TypeMemberFunctionImpl; diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj index 871de96db53..09b8b4553c1 100644 --- a/lldb/lldb.xcodeproj/project.pbxproj +++ b/lldb/lldb.xcodeproj/project.pbxproj @@ -713,7 +713,6 @@ 6D95DC001B9DC057000E318A /* DIERef.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D95DBFD1B9DC057000E318A /* DIERef.cpp */; }; 6D95DC011B9DC057000E318A /* HashedNameToDIE.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D95DBFE1B9DC057000E318A /* HashedNameToDIE.cpp */; }; 6D95DC021B9DC057000E318A /* SymbolFileDWARFDwo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D95DBFF1B9DC057000E318A /* SymbolFileDWARFDwo.cpp */; }; - 6D9AB3DD1BB2B74E003F2289 /* TypeMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D9AB3DC1BB2B74E003F2289 /* TypeMap.cpp */; }; 8C2D6A53197A1EAF006989C9 /* MemoryHistory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C2D6A52197A1EAF006989C9 /* MemoryHistory.cpp */; }; 8C2D6A5E197A250F006989C9 /* MemoryHistoryASan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C2D6A5A197A1FDC006989C9 /* MemoryHistoryASan.cpp */; }; 8CCB017E19BA28A80009FD44 /* ThreadCollection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CCB017A19BA283D0009FD44 /* ThreadCollection.cpp */; }; @@ -2404,8 +2403,6 @@ 6D95DBFF1B9DC057000E318A /* SymbolFileDWARFDwo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SymbolFileDWARFDwo.cpp; sourceTree = "<group>"; }; 6D95DC031B9DC06F000E318A /* DIERef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DIERef.h; sourceTree = "<group>"; }; 6D95DC041B9DC06F000E318A /* SymbolFileDWARFDwo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SymbolFileDWARFDwo.h; sourceTree = "<group>"; }; - 6D9AB3DC1BB2B74E003F2289 /* TypeMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TypeMap.cpp; path = source/Symbol/TypeMap.cpp; sourceTree = "<group>"; }; - 6D9AB3DE1BB2B76B003F2289 /* TypeMap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TypeMap.h; path = include/lldb/Symbol/TypeMap.h; sourceTree = "<group>"; }; 8C2D6A52197A1EAF006989C9 /* MemoryHistory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MemoryHistory.cpp; path = source/Target/MemoryHistory.cpp; sourceTree = "<group>"; }; 8C2D6A54197A1EBE006989C9 /* MemoryHistory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MemoryHistory.h; path = include/lldb/Target/MemoryHistory.h; sourceTree = "<group>"; }; 8C2D6A5A197A1FDC006989C9 /* MemoryHistoryASan.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MemoryHistoryASan.cpp; sourceTree = "<group>"; }; @@ -4210,8 +4207,6 @@ 26BC7C4B10F1B6C100F91463 /* Symbol */ = { isa = PBXGroup; children = ( - 6D9AB3DE1BB2B76B003F2289 /* TypeMap.h */, - 6D9AB3DC1BB2B74E003F2289 /* TypeMap.cpp */, 26BC7C5510F1B6E900F91463 /* Block.h */, 26BC7F1310F1B8EC00F91463 /* Block.cpp */, 26BC7C5610F1B6E900F91463 /* ClangASTContext.h */, @@ -6643,7 +6638,6 @@ 3FBA69E11B6067120008F44A /* ScriptInterpreterNone.cpp in Sources */, 266DFE9713FD656E00D0C574 /* OperatingSystem.cpp in Sources */, 26954EBE1401EE8B00294D09 /* DynamicRegisterInfo.cpp in Sources */, - 6D9AB3DD1BB2B74E003F2289 /* TypeMap.cpp in Sources */, 255EFF761AFABA950069F277 /* LockFilePosix.cpp in Sources */, 3FBA69EC1B6067430008F44A /* PythonDataObjects.cpp in Sources */, 26274FA714030F79006BA130 /* DynamicLoaderDarwinKernel.cpp in Sources */, diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index d433f673b33..715a713de3d 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -1918,6 +1918,7 @@ LookupTypeHere (CommandInterpreter &interpreter, strm.PutCString("Best match found in "); DumpFullpath (strm, &sym_ctx.module_sp->GetFileSpec(), 0); strm.PutCString(":\n"); + TypeSP type_sp (type_list.GetTypeAtIndex(0)); if (type_sp) { diff --git a/lldb/source/Core/Module.cpp b/lldb/source/Core/Module.cpp index 63bbba9afdb..8f6a4a10ac2 100644 --- a/lldb/source/Core/Module.cpp +++ b/lldb/source/Core/Module.cpp @@ -36,7 +36,6 @@ #include "lldb/Target/Target.h" #include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h" #include "Plugins/Language/ObjC/ObjCLanguage.h" -#include "lldb/Symbol/TypeMap.h" #include "Plugins/ObjectFile/JIT/ObjectFileJIT.h" @@ -941,7 +940,7 @@ Module::FindTypes_Impl (const SymbolContext& sc, const CompilerDeclContext *parent_decl_ctx, bool append, size_t max_matches, - TypeMap& types) + TypeList& types) { Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); if (sc.module_sp.get() == NULL || sc.module_sp.get() == this) @@ -961,11 +960,7 @@ Module::FindTypesInNamespace (const SymbolContext& sc, TypeList& type_list) { const bool append = true; - TypeMap types_map; - size_t num_types = FindTypes_Impl(sc, type_name, parent_decl_ctx, append, max_matches, types_map); - if (num_types > 0) - sc.SortTypeList(types_map, type_list); - return num_types; + return FindTypes_Impl(sc, type_name, parent_decl_ctx, append, max_matches, type_list); } lldb::TypeSP @@ -994,7 +989,6 @@ Module::FindTypes (const SymbolContext& sc, std::string type_basename; const bool append = true; TypeClass type_class = eTypeClassAny; - TypeMap typesmap; if (Type::GetTypeScopeAndBasename (type_name_cstr, type_scope, type_basename, type_class)) { // Check if "name" starts with "::" which means the qualified type starts @@ -1008,10 +1002,10 @@ Module::FindTypes (const SymbolContext& sc, exact_match = true; } ConstString type_basename_const_str (type_basename.c_str()); - if (FindTypes_Impl(sc, type_basename_const_str, NULL, append, max_matches, typesmap)) + if (FindTypes_Impl(sc, type_basename_const_str, NULL, append, max_matches, types)) { - typesmap.RemoveMismatchedTypes (type_scope, type_basename, type_class, exact_match); - num_matches = typesmap.GetSize(); + types.RemoveMismatchedTypes (type_scope, type_basename, type_class, exact_match); + num_matches = types.GetSize(); } } else @@ -1021,18 +1015,18 @@ Module::FindTypes (const SymbolContext& sc, { // The "type_name_cstr" will have been modified if we have a valid type class // prefix (like "struct", "class", "union", "typedef" etc). - FindTypes_Impl(sc, ConstString(type_name_cstr), NULL, append, max_matches, typesmap); - typesmap.RemoveMismatchedTypes (type_class); - num_matches = typesmap.GetSize(); + FindTypes_Impl(sc, ConstString(type_name_cstr), NULL, append, max_matches, types); + types.RemoveMismatchedTypes (type_class); + num_matches = types.GetSize(); } else { - num_matches = FindTypes_Impl(sc, name, NULL, append, max_matches, typesmap); + num_matches = FindTypes_Impl(sc, name, NULL, append, max_matches, types); } } - if (num_matches > 0) - sc.SortTypeList(typesmap, types); + return num_matches; + } SymbolVendor* diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index cff808bd70a..43c3d7676ec 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -43,7 +43,6 @@ #include "lldb/Symbol/SymbolVendor.h" #include "lldb/Symbol/TypeSystem.h" #include "lldb/Symbol/VariableList.h" -#include "lldb/Symbol/TypeMap.h" #include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h" #include "Plugins/Language/ObjC/ObjCLanguage.h" @@ -2841,7 +2840,7 @@ SymbolFileDWARF::FindTypes (const SymbolContext& sc, const CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, - TypeMap& types) + TypeList& types) { DWARFDebugInfo* info = DebugInfo(); if (info == NULL) @@ -3055,17 +3054,6 @@ SymbolFileDWARF::GetTypeForDIE (const DWARFDIE &die) CompileUnit* lldb_cu = GetCompUnitForDWARFCompUnit(die.GetCU()); assert (lldb_cu); SymbolContext sc(lldb_cu); - const DWARFDebugInfoEntry* parent_die = die.GetParent().GetDIE(); - while (parent_die != nullptr) - { - if (parent_die->Tag() == DW_TAG_subprogram) - break; - parent_die = parent_die->GetParent(); - } - SymbolContext sc_backup = sc; - if (parent_die != nullptr && !GetFunction(DWARFDIE(die.GetCU(),parent_die), sc)) - sc = sc_backup; - type_sp = ParseType(sc, die, NULL); } else if (type_ptr != DIE_IS_BEING_PARSED) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index 9dfdb3b8fcf..49b0e1de523 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -207,7 +207,7 @@ public: const lldb_private::CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, - lldb_private::TypeMap& types) override; + lldb_private::TypeList& types) override; lldb_private::TypeList * GetTypeList () override; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index 9aaaa1da8fd..6d33d6cb4f5 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -28,7 +28,6 @@ #include "lldb/Symbol/LineTable.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolVendor.h" -#include "lldb/Symbol/TypeMap.h" #include "lldb/Symbol/VariableList.h" #include "LogChannelDWARF.h" @@ -1296,7 +1295,7 @@ SymbolFileDWARFDebugMap::FindTypes const CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, - TypeMap& types + TypeList& types ) { if (!append) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h index cc79f4e5cd7..fde63ab8095 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -79,7 +79,7 @@ public: uint32_t FindGlobalVariables (const lldb_private::RegularExpression& regex, bool append, uint32_t max_matches, lldb_private::VariableList& variables) override; uint32_t FindFunctions (const lldb_private::ConstString &name, const lldb_private::CompilerDeclContext *parent_decl_ctx, uint32_t name_type_mask, bool include_inlines, bool append, lldb_private::SymbolContextList& sc_list) override; uint32_t FindFunctions (const lldb_private::RegularExpression& regex, bool include_inlines, bool append, lldb_private::SymbolContextList& sc_list) override; - uint32_t FindTypes (const lldb_private::SymbolContext& sc, const lldb_private::ConstString &name, const lldb_private::CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, lldb_private::TypeMap& types) override; + uint32_t FindTypes (const lldb_private::SymbolContext& sc, const lldb_private::ConstString &name, const lldb_private::CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, lldb_private::TypeList& types) override; lldb_private::CompilerDeclContext FindNamespace (const lldb_private::SymbolContext& sc, const lldb_private::ConstString &name, 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); -} diff --git a/lldb/test/lang/c/typedef/Makefile b/lldb/test/lang/c/typedef/Makefile deleted file mode 100644 index b09a579159d..00000000000 --- a/lldb/test/lang/c/typedef/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -LEVEL = ../../../make - -C_SOURCES := main.c - -include $(LEVEL)/Makefile.rules diff --git a/lldb/test/lang/c/typedef/Testtypedef.py b/lldb/test/lang/c/typedef/Testtypedef.py deleted file mode 100644 index c00bcd4e3c5..00000000000 --- a/lldb/test/lang/c/typedef/Testtypedef.py +++ /dev/null @@ -1,51 +0,0 @@ -"""Look up type information for typedefs of same name at different lexical scope and check for correct display.""" - -import os, time -import unittest2 -import lldb -from lldbtest import * -import lldbutil - -class TypedefTestCase(TestBase): - - mydir = TestBase.compute_mydir(__file__) - - @skipUnlessDarwin - @dsym_test - @expectedFailureClang("llvm.org/pr19238") - def test_with_dsym(self): - """Test 'image lookup -t a' and check for correct display at different scopes.""" - self.buildDsym() - self.image_lookup_for_multiple_typedefs() - - @dwarf_test - @expectedFailureClang("llvm.org/pr19238") - def test_with_dwarf(self): - """Test 'image lookup -t a' and check for correct display at different scopes.""" - self.buildDwarf() - self.image_lookup_for_multiple_typedefs() - - def image_lookup_for_multiple_typedefs(self): - """Test 'image lookup -t a' at different scopes and check for correct display.""" - exe = os.path.join(os.getcwd(), "a.out") - self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) - typearray = ("float", "float", "char", "float", "int", "double", "float", "float") - arraylen = len(typearray)+1 - for i in range(1,arraylen): - loc_line = line_number('main.c', '// Set break point ' + str(i) + '.') - lldbutil.run_break_set_by_file_and_line (self, "main.c",loc_line, num_expected_locations=1, loc_exact=True) - - self.runCmd("run", RUN_SUCCEEDED) - - for t in typearray: - self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, - substrs = ['stopped', 'stop reason = breakpoint']) - self.expect("image lookup -t a", DATA_TYPES_DISPLAYED_CORRECTLY, - substrs = ['name = "' + t + '"']) - self.runCmd("continue") - -if __name__ == '__main__': - import atexit - lldb.SBDebugger.Initialize() - atexit.register(lambda: lldb.SBDebugger.Terminate()) - unittest2.main() diff --git a/lldb/test/lang/c/typedef/main.c b/lldb/test/lang/c/typedef/main.c deleted file mode 100644 index 6c13affbbc1..00000000000 --- a/lldb/test/lang/c/typedef/main.c +++ /dev/null @@ -1,40 +0,0 @@ -//===-- main.c --------------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -int main (int argc, char const *argv[]) -{ - typedef float a; - int i = 0; // Set break point 1. - i++; - a floatvariable = 2.7; // Set break point 2. - { - typedef char a; - i++; - a charvariable = 'a'; // Set break point 3. - } - { - int c = 0; - c++; // Set break point 4. - for(i = 0 ; i < 1 ; i++) - { - typedef int a; - a b; - b = 7; // Set break point 5. - } - for(i = 0 ; i < 1 ; i++) - { - typedef double a; - a b; - b = 3.14; // Set break point 6. - } - c = 1; // Set break point 7. - } - floatvariable = 2.5; - floatvariable = 2.8; // Set break point 8. - return 0; -} |