[Lldb-commits] [lldb] r248366 - Testcase and fix for bug 24074

Ryan Brown via lldb-commits lldb-commits at lists.llvm.org
Wed Sep 23 07:59:28 PDT 2015


The doc comment for SortTypeList() is wrong.
On Sep 23, 2015 12:20 AM, "Ravitheja Addepally via lldb-commits" <
lldb-commits at lists.llvm.org> wrote:

> Author: ravitheja
> Date: Wed Sep 23 02:19:02 2015
> New Revision: 248366
>
> URL: http://llvm.org/viewvc/llvm-project?rev=248366&view=rev
> Log:
> Testcase and fix for bug 24074
>
> Summary:
> In bug 24074, the type information is not shown
> correctly. This commit  includes the following -
> -> Changes for displaying correct type based on
>    current lexical scope for the command "image
>    lookup -t"
> -> The corresponding testcase.
>
> Reviewers: jingham, ovyalov, spyffe, richard.mitton, clayborg
>
> Differential Revision: http://reviews.llvm.org/D12404
>
> Added:
>     lldb/trunk/include/lldb/Symbol/TypeMap.h
>     lldb/trunk/source/Symbol/TypeMap.cpp
>     lldb/trunk/test/lang/c/typedef/
>     lldb/trunk/test/lang/c/typedef/Makefile
>     lldb/trunk/test/lang/c/typedef/Testtypedef.py
>     lldb/trunk/test/lang/c/typedef/main.c
> Modified:
>     lldb/trunk/include/lldb/Core/Module.h
>     lldb/trunk/include/lldb/Symbol/SymbolContext.h
>     lldb/trunk/include/lldb/Symbol/SymbolFile.h
>     lldb/trunk/include/lldb/Symbol/SymbolVendor.h
>     lldb/trunk/include/lldb/Symbol/TypeList.h
>     lldb/trunk/include/lldb/lldb-forward.h
>     lldb/trunk/source/Commands/CommandObjectTarget.cpp
>     lldb/trunk/source/Core/Module.cpp
>     lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
>     lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
>     lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
>     lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
>     lldb/trunk/source/Symbol/CMakeLists.txt
>     lldb/trunk/source/Symbol/SymbolContext.cpp
>     lldb/trunk/source/Symbol/SymbolFile.cpp
>     lldb/trunk/source/Symbol/SymbolVendor.cpp
>     lldb/trunk/source/Symbol/TypeList.cpp
>
> Modified: lldb/trunk/include/lldb/Core/Module.h
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Module.h?rev=248366&r1=248365&r2=248366&view=diff
>
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/Module.h (original)
> +++ lldb/trunk/include/lldb/Core/Module.h Wed Sep 23 02:19:02 2015
> @@ -1193,7 +1193,7 @@ private:
>                      const CompilerDeclContext *parent_decl_ctx,
>                      bool append,
>                      size_t max_matches,
> -                    TypeList& types);
> +                    TypeMap& types);
>
>
>      DISALLOW_COPY_AND_ASSIGN (Module);
>
> Modified: lldb/trunk/include/lldb/Symbol/SymbolContext.h
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/SymbolContext.h?rev=248366&r1=248365&r2=248366&view=diff
>
> ==============================================================================
> --- lldb/trunk/include/lldb/Symbol/SymbolContext.h (original)
> +++ lldb/trunk/include/lldb/Symbol/SymbolContext.h Wed Sep 23 02:19:02 2015
> @@ -299,6 +299,27 @@ 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,
>
> Modified: lldb/trunk/include/lldb/Symbol/SymbolFile.h
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/SymbolFile.h?rev=248366&r1=248365&r2=248366&view=diff
>
> ==============================================================================
> --- lldb/trunk/include/lldb/Symbol/SymbolFile.h (original)
> +++ lldb/trunk/include/lldb/Symbol/SymbolFile.h Wed Sep 23 02:19:02 2015
> @@ -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, TypeList& types);
> +    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
> RegularExpression& regex, bool append, uint32_t max_matches, TypeList&
> types) = 0;
>      virtual TypeList *      GetTypeList ();
>      virtual size_t          GetTypes (lldb_private::SymbolContextScope
> *sc_scope,
>
> Modified: lldb/trunk/include/lldb/Symbol/SymbolVendor.h
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/SymbolVendor.h?rev=248366&r1=248365&r2=248366&view=diff
>
> ==============================================================================
> --- lldb/trunk/include/lldb/Symbol/SymbolVendor.h (original)
> +++ lldb/trunk/include/lldb/Symbol/SymbolVendor.h Wed Sep 23 02:19:02 2015
> @@ -16,6 +16,7 @@
>  #include "lldb/Core/ModuleChild.h"
>  #include "lldb/Core/PluginInterface.h"
>  #include "lldb/Symbol/TypeList.h"
> +#include "lldb/Symbol/TypeMap.h"
>
>  namespace lldb_private {
>
> @@ -125,7 +126,7 @@ public:
>                 const CompilerDeclContext *parent_decl_ctx,
>                 bool append,
>                 size_t max_matches,
> -               TypeList& types);
> +               TypeMap& types);
>
>      virtual CompilerDeclContext
>      FindNamespace (const SymbolContext& sc,
>
> Modified: lldb/trunk/include/lldb/Symbol/TypeList.h
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/TypeList.h?rev=248366&r1=248365&r2=248366&view=diff
>
> ==============================================================================
> --- lldb/trunk/include/lldb/Symbol/TypeList.h (original)
> +++ lldb/trunk/include/lldb/Symbol/TypeList.h Wed Sep 23 02:19:02 2015
> @@ -13,7 +13,7 @@
>  #include "lldb/lldb-private.h"
>  #include "lldb/Symbol/Type.h"
>  #include "lldb/Utility/Iterable.h"
> -#include <map>
> +#include <vector>
>  #include <functional>
>
>  namespace lldb_private {
> @@ -24,7 +24,7 @@ public:
>      //------------------------------------------------------------------
>      // Constructors and Destructors
>      //------------------------------------------------------------------
> -    TypeList();
> +       TypeList();
>
>      virtual
>      ~TypeList();
> @@ -44,17 +44,14 @@ 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::multimap<lldb::user_id_t, lldb::TypeSP> collection;
> -    typedef AdaptedIterable<collection, lldb::TypeSP, map_adapter>
> TypeIterable;
> +    typedef std::vector<lldb::TypeSP> collection;
> +    typedef AdaptedIterable<collection, lldb::TypeSP, vector_adapter>
> TypeIterable;
>
>      TypeIterable
>      Types ()
> @@ -68,8 +65,6 @@ 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,
>
> Added: lldb/trunk/include/lldb/Symbol/TypeMap.h
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/TypeMap.h?rev=248366&view=auto
>
> ==============================================================================
> --- lldb/trunk/include/lldb/Symbol/TypeMap.h (added)
> +++ lldb/trunk/include/lldb/Symbol/TypeMap.h Wed Sep 23 02:19:02 2015
> @@ -0,0 +1,98 @@
> +//===-- 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_
>
> Modified: lldb/trunk/include/lldb/lldb-forward.h
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-forward.h?rev=248366&r1=248365&r2=248366&view=diff
>
> ==============================================================================
> --- lldb/trunk/include/lldb/lldb-forward.h (original)
> +++ lldb/trunk/include/lldb/lldb-forward.h Wed Sep 23 02:19:02 2015
> @@ -254,6 +254,7 @@ class   TypeAndOrName;
>  class   TypeCategoryMap;
>  class   TypeImpl;
>  class   TypeList;
> +class   TypeMap;
>  class   TypeListImpl;
>  class   TypeMemberImpl;
>  class   TypeMemberFunctionImpl;
>
> Modified: lldb/trunk/source/Commands/CommandObjectTarget.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectTarget.cpp?rev=248366&r1=248365&r2=248366&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Commands/CommandObjectTarget.cpp (original)
> +++ lldb/trunk/source/Commands/CommandObjectTarget.cpp Wed Sep 23 02:19:02
> 2015
> @@ -1918,7 +1918,6 @@ LookupTypeHere (CommandInterpreter &inte
>          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)
>          {
>
> Modified: lldb/trunk/source/Core/Module.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Module.cpp?rev=248366&r1=248365&r2=248366&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Core/Module.cpp (original)
> +++ lldb/trunk/source/Core/Module.cpp Wed Sep 23 02:19:02 2015
> @@ -36,6 +36,7 @@
>  #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"
>
> @@ -940,7 +941,7 @@ Module::FindTypes_Impl (const SymbolCont
>                          const CompilerDeclContext *parent_decl_ctx,
>                          bool append,
>                          size_t max_matches,
> -                        TypeList& types)
> +                        TypeMap& types)
>  {
>      Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
>      if (sc.module_sp.get() == NULL || sc.module_sp.get() == this)
> @@ -960,7 +961,11 @@ Module::FindTypesInNamespace (const Symb
>                                TypeList& type_list)
>  {
>      const bool append = true;
> -    return FindTypes_Impl(sc, type_name, parent_decl_ctx, append,
> max_matches, type_list);
> +    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;
>  }
>
>  lldb::TypeSP
> @@ -989,6 +994,7 @@ Module::FindTypes (const SymbolContext&
>      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
> @@ -1002,10 +1008,10 @@ Module::FindTypes (const SymbolContext&
>              exact_match = true;
>          }
>          ConstString type_basename_const_str (type_basename.c_str());
> -        if (FindTypes_Impl(sc, type_basename_const_str, NULL, append,
> max_matches, types))
> +        if (FindTypes_Impl(sc, type_basename_const_str, NULL, append,
> max_matches, typesmap))
>          {
> -            types.RemoveMismatchedTypes (type_scope, type_basename,
> type_class, exact_match);
> -            num_matches = types.GetSize();
> +            typesmap.RemoveMismatchedTypes (type_scope, type_basename,
> type_class, exact_match);
> +            num_matches = typesmap.GetSize();
>          }
>      }
>      else
> @@ -1015,18 +1021,18 @@ Module::FindTypes (const SymbolContext&
>          {
>              // 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, types);
> -            types.RemoveMismatchedTypes (type_class);
> -            num_matches = types.GetSize();
> +            FindTypes_Impl(sc, ConstString(type_name_cstr), NULL, append,
> max_matches, typesmap);
> +            typesmap.RemoveMismatchedTypes (type_class);
> +            num_matches = typesmap.GetSize();
>          }
>          else
>          {
> -            num_matches = FindTypes_Impl(sc, name, NULL, append,
> max_matches, types);
> +            num_matches = FindTypes_Impl(sc, name, NULL, append,
> max_matches, typesmap);
>          }
>      }
> -
> +    if (num_matches > 0)
> +        sc.SortTypeList(typesmap, types);
>      return num_matches;
> -
>  }
>
>  SymbolVendor*
>
> Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp?rev=248366&r1=248365&r2=248366&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
> (original)
> +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Wed Sep
> 23 02:19:02 2015
> @@ -43,6 +43,7 @@
>  #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"
> @@ -2840,7 +2841,7 @@ SymbolFileDWARF::FindTypes (const Symbol
>                              const CompilerDeclContext *parent_decl_ctx,
>                              bool append,
>                              uint32_t max_matches,
> -                            TypeList& types)
> +                            TypeMap& types)
>  {
>      DWARFDebugInfo* info = DebugInfo();
>      if (info == NULL)
> @@ -3054,6 +3055,17 @@ SymbolFileDWARF::GetTypeForDIE (const DW
>              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)
>
> Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h?rev=248366&r1=248365&r2=248366&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h (original)
> +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h Wed Sep
> 23 02:19:02 2015
> @@ -207,7 +207,7 @@ public:
>                 const lldb_private::CompilerDeclContext *parent_decl_ctx,
>                 bool append,
>                 uint32_t max_matches,
> -               lldb_private::TypeList& types) override;
> +               lldb_private::TypeMap& types) override;
>
>      lldb_private::TypeList *
>      GetTypeList () override;
>
> Modified:
> lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp?rev=248366&r1=248365&r2=248366&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
> (original)
> +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
> Wed Sep 23 02:19:02 2015
> @@ -28,6 +28,7 @@
>  #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"
> @@ -1295,7 +1296,7 @@ SymbolFileDWARFDebugMap::FindTypes
>      const CompilerDeclContext *parent_decl_ctx,
>      bool append,
>      uint32_t max_matches,
> -    TypeList& types
> +    TypeMap& types
>  )
>  {
>      if (!append)
>
> Modified:
> lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h?rev=248366&r1=248365&r2=248366&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
> (original)
> +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
> Wed Sep 23 02:19:02 2015
> @@ -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::TypeList& 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::TypeMap& types) override;
>      lldb_private::CompilerDeclContext
>                      FindNamespace (const lldb_private::SymbolContext& sc,
>                                     const lldb_private::ConstString &name,
>
> Modified: lldb/trunk/source/Symbol/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/CMakeLists.txt?rev=248366&r1=248365&r2=248366&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Symbol/CMakeLists.txt (original)
> +++ lldb/trunk/source/Symbol/CMakeLists.txt Wed Sep 23 02:19:02 2015
> @@ -24,6 +24,7 @@ add_lldb_library(lldbSymbol
>    Symtab.cpp
>    Type.cpp
>    TypeList.cpp
> +  TypeMap.cpp
>    TypeSystem.cpp
>    UnwindPlan.cpp
>    UnwindTable.cpp
>
> Modified: lldb/trunk/source/Symbol/SymbolContext.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/SymbolContext.cpp?rev=248366&r1=248365&r2=248366&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Symbol/SymbolContext.cpp (original)
> +++ lldb/trunk/source/Symbol/SymbolContext.cpp Wed Sep 23 02:19:02 2015
> @@ -659,6 +659,171 @@ SymbolContext::GetFunctionMethodInfo (ll
>      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
>  {
>
> Modified: lldb/trunk/source/Symbol/SymbolFile.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/SymbolFile.cpp?rev=248366&r1=248365&r2=248366&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Symbol/SymbolFile.cpp (original)
> +++ lldb/trunk/source/Symbol/SymbolFile.cpp Wed Sep 23 02:19:02 2015
> @@ -15,7 +15,7 @@
>  #include "lldb/Core/PluginManager.h"
>  #include "lldb/Core/StreamString.h"
>  #include "lldb/Symbol/ObjectFile.h"
> -#include "lldb/Symbol/TypeList.h"
> +#include "lldb/Symbol/TypeMap.h"
>  #include "lldb/Symbol/TypeSystem.h"
>  #include "lldb/Symbol/VariableList.h"
>
> @@ -135,7 +135,7 @@ SymbolFile::FindFunctions (const Regular
>  }
>
>  uint32_t
> -SymbolFile::FindTypes (const SymbolContext& sc, const ConstString &name,
> const CompilerDeclContext *parent_decl_ctx, bool append, uint32_t
> max_matches, TypeList& types)
> +SymbolFile::FindTypes (const SymbolContext& sc, const ConstString &name,
> const CompilerDeclContext *parent_decl_ctx, bool append, uint32_t
> max_matches, TypeMap& types)
>  {
>      if (!append)
>          types.Clear();
>
> Modified: lldb/trunk/source/Symbol/SymbolVendor.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/SymbolVendor.cpp?rev=248366&r1=248365&r2=248366&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Symbol/SymbolVendor.cpp (original)
> +++ lldb/trunk/source/Symbol/SymbolVendor.cpp Wed Sep 23 02:19:02 2015
> @@ -346,7 +346,7 @@ SymbolVendor::FindFunctions(const Regula
>
>
>  size_t
> -SymbolVendor::FindTypes (const SymbolContext& sc, const ConstString
> &name, const CompilerDeclContext *parent_decl_ctx, bool append, size_t
> max_matches, TypeList& types)
> +SymbolVendor::FindTypes (const SymbolContext& sc, const ConstString
> &name, const CompilerDeclContext *parent_decl_ctx, bool append, size_t
> max_matches, TypeMap& types)
>  {
>      ModuleSP module_sp(GetModule());
>      if (module_sp)
>
> Modified: lldb/trunk/source/Symbol/TypeList.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/TypeList.cpp?rev=248366&r1=248365&r2=248366&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Symbol/TypeList.cpp (original)
> +++ lldb/trunk/source/Symbol/TypeList.cpp Wed Sep 23 02:19:02 2015
> @@ -42,26 +42,7 @@ 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.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;
> +        m_types.push_back(type_sp);
>  }
>
>  //----------------------------------------------------------------------
> @@ -116,7 +97,7 @@ TypeList::GetTypeAtIndex(uint32_t idx)
>      for (pos = m_types.begin(), end = m_types.end(); pos != end; ++pos)
>      {
>          if (i == 0)
> -            return pos->second;
> +            return *pos;
>          --i;
>      }
>      return TypeSP();
> @@ -127,7 +108,7 @@ TypeList::ForEach (std::function <bool(c
>  {
>      for (auto pos = m_types.begin(), end = m_types.end(); pos != end;
> ++pos)
>      {
> -        if (!callback(pos->second))
> +        if (!callback(*pos))
>              break;
>      }
>  }
> @@ -137,32 +118,17 @@ TypeList::ForEach (std::function <bool(l
>  {
>      for (auto pos = m_types.begin(), end = m_types.end(); pos != end;
> ++pos)
>      {
> -        if (!callback(pos->second))
> +        if (!callback(*pos))
>              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->second->Dump(s, show_context);
> +        pos->get()->Dump(s, show_context);
>      }
>  }
>
> @@ -197,7 +163,7 @@ TypeList::RemoveMismatchedTypes (const s
>
>      for (pos = m_types.begin(); pos != end; ++pos)
>      {
> -        Type* the_type = pos->second.get();
> +        Type* the_type = pos->get();
>          bool keep_match = false;
>          TypeClass match_type_class = eTypeClassAny;
>
> @@ -269,7 +235,7 @@ TypeList::RemoveMismatchedTypes (const s
>
>          if (keep_match)
>          {
> -            matching_types.insert (*pos);
> +            matching_types.push_back(*pos);
>          }
>      }
>      m_types.swap(matching_types);
> @@ -291,10 +257,10 @@ TypeList::RemoveMismatchedTypes (TypeCla
>
>      for (pos = m_types.begin(); pos != end; ++pos)
>      {
> -        Type* the_type = pos->second.get();
> +        Type* the_type = pos->get();
>          TypeClass match_type_class = the_type->GetForwardCompilerType
> ().GetTypeClass ();
>          if (match_type_class & type_class)
> -            matching_types.insert (*pos);
> +            matching_types.push_back (*pos);
>      }
>      m_types.swap(matching_types);
>  }
>
> Added: lldb/trunk/source/Symbol/TypeMap.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/TypeMap.cpp?rev=248366&view=auto
>
> ==============================================================================
> --- lldb/trunk/source/Symbol/TypeMap.cpp (added)
> +++ lldb/trunk/source/Symbol/TypeMap.cpp Wed Sep 23 02:19:02 2015
> @@ -0,0 +1,313 @@
> +//===-- 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);
> +}
>
> Added: lldb/trunk/test/lang/c/typedef/Makefile
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/c/typedef/Makefile?rev=248366&view=auto
>
> ==============================================================================
> --- lldb/trunk/test/lang/c/typedef/Makefile (added)
> +++ lldb/trunk/test/lang/c/typedef/Makefile Wed Sep 23 02:19:02 2015
> @@ -0,0 +1,5 @@
> +LEVEL = ../../../make
> +
> +C_SOURCES := main.c
> +
> +include $(LEVEL)/Makefile.rules
>
> Added: lldb/trunk/test/lang/c/typedef/Testtypedef.py
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/c/typedef/Testtypedef.py?rev=248366&view=auto
>
> ==============================================================================
> --- lldb/trunk/test/lang/c/typedef/Testtypedef.py (added)
> +++ lldb/trunk/test/lang/c/typedef/Testtypedef.py Wed Sep 23 02:19:02 2015
> @@ -0,0 +1,51 @@
> +"""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()
>
> Added: lldb/trunk/test/lang/c/typedef/main.c
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/c/typedef/main.c?rev=248366&view=auto
>
> ==============================================================================
> --- lldb/trunk/test/lang/c/typedef/main.c (added)
> +++ lldb/trunk/test/lang/c/typedef/main.c Wed Sep 23 02:19:02 2015
> @@ -0,0 +1,40 @@
> +//===-- 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;
> +}
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20150923/dd28bff4/attachment-0001.html>


More information about the lldb-commits mailing list