summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2013-04-11 16:57:51 +0000
committerGreg Clayton <gclayton@apple.com>2013-04-11 16:57:51 +0000
commit973b6c9b00307bfa32cbe06e13ca7c6770ea3159 (patch)
tree2d7d0b297b7c363884f77a40c6f2027b2c3715ea
parent9eb4b33f8530c38249f17dc2ae49ee05eaf65b1d (diff)
downloadbcm5719-llvm-973b6c9b00307bfa32cbe06e13ca7c6770ea3159.tar.gz
bcm5719-llvm-973b6c9b00307bfa32cbe06e13ca7c6770ea3159.zip
Static variables inside classes were not being added to the RecordDecl, now they are. This gets us closer to being able to display static variables in classes.
llvm-svn: 179296
-rw-r--r--lldb/include/lldb/Symbol/ClangASTContext.h20
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp11
-rw-r--r--lldb/source/Symbol/ClangASTContext.cpp61
3 files changed, 84 insertions, 8 deletions
diff --git a/lldb/include/lldb/Symbol/ClangASTContext.h b/lldb/include/lldb/Symbol/ClangASTContext.h
index 2678af53ac1..4df93f4c132 100644
--- a/lldb/include/lldb/Symbol/ClangASTContext.h
+++ b/lldb/include/lldb/Symbol/ClangASTContext.h
@@ -336,6 +336,26 @@ public:
bitfield_bit_size);
}
+ clang::VarDecl *
+ AddVariableToRecordType (lldb::clang_type_t record_opaque_type,
+ const char *name,
+ lldb::clang_type_t var_opaque_type,
+ lldb::AccessType access)
+ {
+ return ClangASTContext::AddVariableToRecordType (getASTContext(),
+ record_opaque_type,
+ name,
+ var_opaque_type,
+ access);
+ }
+
+ static clang::VarDecl *
+ AddVariableToRecordType (clang::ASTContext *ast,
+ lldb::clang_type_t record_opaque_type,
+ const char *name,
+ lldb::clang_type_t var_opaque_type,
+ lldb::AccessType access);
+
static void
BuildIndirectFields (clang::ASTContext *ast,
lldb::clang_type_t record_qual_type);
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index 19ca60a7404..625f62e775a 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -1685,7 +1685,18 @@ SymbolFileDWARF::ParseChildMembers
// Skip static members
if (is_external && member_byte_offset == UINT32_MAX)
+ {
+ Type *var_type = ResolveTypeUID(encoding_uid);
+
+ if (var_type)
+ {
+ GetClangASTContext().AddVariableToRecordType (class_clang_type,
+ name,
+ var_type->GetClangLayoutType(),
+ accessibility);
+ }
break;
+ }
if (is_artificial == false)
{
diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp
index 8d03e93eeb8..fb6289f9e89 100644
--- a/lldb/source/Symbol/ClangASTContext.cpp
+++ b/lldb/source/Symbol/ClangASTContext.cpp
@@ -1990,10 +1990,10 @@ ClangASTContext::AddFieldToRecordType
}
}
- field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
-
if (field)
{
+ field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
+
record_decl->addDecl(field);
#ifdef LLDB_CONFIGURATION_DEBUG
@@ -2008,18 +2008,63 @@ ClangASTContext::AddFieldToRecordType
{
bool is_synthesized = false;
field = ClangASTContext::AddObjCClassIVar (ast,
- record_clang_type,
- name,
- field_type,
- access,
- bitfield_bit_size,
- is_synthesized);
+ record_clang_type,
+ name,
+ field_type,
+ access,
+ bitfield_bit_size,
+ is_synthesized);
}
}
}
return field;
}
+clang::VarDecl *
+ClangASTContext::AddVariableToRecordType (clang::ASTContext *ast,
+ lldb::clang_type_t record_opaque_type,
+ const char *name,
+ lldb::clang_type_t var_type,
+ AccessType access)
+{
+ clang::VarDecl *var_decl = NULL;
+
+ if (record_opaque_type == NULL || var_type == NULL)
+ return NULL;
+
+ IdentifierTable *identifier_table = &ast->Idents;
+
+ assert (ast != NULL);
+ assert (identifier_table != NULL);
+
+ const RecordType *record_type = dyn_cast<RecordType>(QualType::getFromOpaquePtr(record_opaque_type).getTypePtr());
+
+ if (record_type)
+ {
+ RecordDecl *record_decl = record_type->getDecl();
+
+ var_decl = VarDecl::Create (*ast, // ASTContext &
+ record_decl, // DeclContext *
+ SourceLocation(), // SourceLocation StartLoc
+ SourceLocation(), // SourceLocation IdLoc
+ name ? &identifier_table->get(name) : NULL, // IdentifierInfo *
+ QualType::getFromOpaquePtr(var_type), // Variable QualType
+ NULL, // TypeSourceInfo *
+ SC_Static); // StorageClass
+ if (var_decl)
+ {
+ var_decl->setAccess(ConvertAccessTypeToAccessSpecifier (access));
+ record_decl->addDecl(var_decl);
+
+#ifdef LLDB_CONFIGURATION_DEBUG
+ VerifyDecl(var_decl);
+#endif
+ }
+ }
+ return var_decl;
+}
+
+
static clang::AccessSpecifier UnifyAccessSpecifiers (clang::AccessSpecifier lhs,
clang::AccessSpecifier rhs)
{
OpenPOWER on IntegriCloud