[Lldb-commits] [lldb] r249673 - Testcase and fix for bug 24074
Ravitheja Addepally via lldb-commits
lldb-commits at lists.llvm.org
Thu Oct 8 02:45:42 PDT 2015
Author: ravitheja
Date: Thu Oct 8 04:45:41 2015
New Revision: 249673
URL: http://llvm.org/viewvc/llvm-project?rev=249673&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.
-> This patch was reverted due to segfaults in
FreeBSD and Mac, I fixed the problems for both now.
Reviewers: emaste, granata.enrico, jingham, clayborg
Differential Revision: http://reviews.llvm.org/D13290
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/lldb.xcodeproj/project.pbxproj
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=249673&r1=249672&r2=249673&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Module.h (original)
+++ lldb/trunk/include/lldb/Core/Module.h Thu Oct 8 04:45:41 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=249673&r1=249672&r2=249673&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/SymbolContext.h (original)
+++ lldb/trunk/include/lldb/Symbol/SymbolContext.h Thu Oct 8 04:45:41 2015
@@ -299,6 +299,13 @@ public:
ConstString &language_object_name);
//------------------------------------------------------------------
+ /// Sorts the types in TypeMap according to SymbolContext
+ /// to TypeList
+ ///
+ //------------------------------------------------------------------
+ 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=249673&r1=249672&r2=249673&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/SymbolFile.h (original)
+++ lldb/trunk/include/lldb/Symbol/SymbolFile.h Thu Oct 8 04:45:41 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=249673&r1=249672&r2=249673&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/SymbolVendor.h (original)
+++ lldb/trunk/include/lldb/Symbol/SymbolVendor.h Thu Oct 8 04:45:41 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=249673&r1=249672&r2=249673&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/TypeList.h (original)
+++ lldb/trunk/include/lldb/Symbol/TypeList.h Thu Oct 8 04:45:41 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=249673&view=auto
==============================================================================
--- lldb/trunk/include/lldb/Symbol/TypeMap.h (added)
+++ lldb/trunk/include/lldb/Symbol/TypeMap.h Thu Oct 8 04:45:41 2015
@@ -0,0 +1,101 @@
+//===-- 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
+ Empty() const;
+
+ 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=249673&r1=249672&r2=249673&view=diff
==============================================================================
--- lldb/trunk/include/lldb/lldb-forward.h (original)
+++ lldb/trunk/include/lldb/lldb-forward.h Thu Oct 8 04:45:41 2015
@@ -256,6 +256,7 @@ class TypeAndOrName;
class TypeCategoryMap;
class TypeImpl;
class TypeList;
+class TypeMap;
class TypeListImpl;
class TypeMemberImpl;
class TypeMemberFunctionImpl;
Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxproj?rev=249673&r1=249672&r2=249673&view=diff
==============================================================================
--- lldb/trunk/lldb.xcodeproj/project.pbxproj (original)
+++ lldb/trunk/lldb.xcodeproj/project.pbxproj Thu Oct 8 04:45:41 2015
@@ -713,6 +713,7 @@
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 */; };
6D99A3631BBC2F3200979793 /* ArmUnwindInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D99A3621BBC2F3200979793 /* ArmUnwindInfo.cpp */; };
8C2D6A53197A1EAF006989C9 /* MemoryHistory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C2D6A52197A1EAF006989C9 /* MemoryHistory.cpp */; };
8C2D6A5E197A250F006989C9 /* MemoryHistoryASan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C2D6A5A197A1FDC006989C9 /* MemoryHistoryASan.cpp */; };
@@ -2406,6 +2407,8 @@
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>"; };
6D99A3611BBC2F1600979793 /* ArmUnwindInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ArmUnwindInfo.h; path = include/lldb/Symbol/ArmUnwindInfo.h; sourceTree = "<group>"; };
6D99A3621BBC2F3200979793 /* ArmUnwindInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ArmUnwindInfo.cpp; path = source/Symbol/ArmUnwindInfo.cpp; sourceTree = "<group>"; };
8C2D6A52197A1EAF006989C9 /* MemoryHistory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MemoryHistory.cpp; path = source/Target/MemoryHistory.cpp; sourceTree = "<group>"; };
@@ -4218,6 +4221,8 @@
26BC7C4B10F1B6C100F91463 /* Symbol */ = {
isa = PBXGroup;
children = (
+ 6D9AB3DE1BB2B76B003F2289 /* TypeMap.h */,
+ 6D9AB3DC1BB2B74E003F2289 /* TypeMap.cpp */,
6D99A3621BBC2F3200979793 /* ArmUnwindInfo.cpp */,
6D99A3611BBC2F1600979793 /* ArmUnwindInfo.h */,
26BC7C5510F1B6E900F91463 /* Block.h */,
@@ -6668,6 +6673,7 @@
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 */,
Modified: lldb/trunk/source/Core/Module.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Module.cpp?rev=249673&r1=249672&r2=249673&view=diff
==============================================================================
--- lldb/trunk/source/Core/Module.cpp (original)
+++ lldb/trunk/source/Core/Module.cpp Thu Oct 8 04:45:41 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=249673&r1=249672&r2=249673&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Thu Oct 8 04:45:41 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=249673&r1=249672&r2=249673&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h Thu Oct 8 04:45:41 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=249673&r1=249672&r2=249673&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp Thu Oct 8 04:45:41 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=249673&r1=249672&r2=249673&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h Thu Oct 8 04:45:41 2015
@@ -81,7 +81,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=249673&r1=249672&r2=249673&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/CMakeLists.txt (original)
+++ lldb/trunk/source/Symbol/CMakeLists.txt Thu Oct 8 04:45:41 2015
@@ -25,6 +25,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=249673&r1=249672&r2=249673&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/SymbolContext.cpp (original)
+++ lldb/trunk/source/Symbol/SymbolContext.cpp Thu Oct 8 04:45:41 2015
@@ -659,6 +659,174 @@ 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());
+ if (type_map.Empty())
+ return false;
+ }
+ 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=249673&r1=249672&r2=249673&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/SymbolFile.cpp (original)
+++ lldb/trunk/source/Symbol/SymbolFile.cpp Thu Oct 8 04:45:41 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=249673&r1=249672&r2=249673&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/SymbolVendor.cpp (original)
+++ lldb/trunk/source/Symbol/SymbolVendor.cpp Thu Oct 8 04:45:41 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=249673&r1=249672&r2=249673&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/TypeList.cpp (original)
+++ lldb/trunk/source/Symbol/TypeList.cpp Thu Oct 8 04:45:41 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=249673&view=auto
==============================================================================
--- lldb/trunk/source/Symbol/TypeMap.cpp (added)
+++ lldb/trunk/source/Symbol/TypeMap.cpp Thu Oct 8 04:45:41 2015
@@ -0,0 +1,319 @@
+//===-- 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();
+}
+
+bool
+TypeMap::Empty() const
+{
+ return m_types.empty();
+}
+
+// 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=249673&view=auto
==============================================================================
--- lldb/trunk/test/lang/c/typedef/Makefile (added)
+++ lldb/trunk/test/lang/c/typedef/Makefile Thu Oct 8 04:45:41 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=249673&view=auto
==============================================================================
--- lldb/trunk/test/lang/c/typedef/Testtypedef.py (added)
+++ lldb/trunk/test/lang/c/typedef/Testtypedef.py Thu Oct 8 04:45:41 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=249673&view=auto
==============================================================================
--- lldb/trunk/test/lang/c/typedef/main.c (added)
+++ lldb/trunk/test/lang/c/typedef/main.c Thu Oct 8 04:45:41 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;
+}
More information about the lldb-commits
mailing list