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
This commit is contained in:
Greg Clayton 2013-04-11 16:57:51 +00:00
parent 9eb4b33f85
commit 973b6c9b00
3 changed files with 84 additions and 8 deletions

View File

@ -336,6 +336,26 @@ public:
bitfield_bit_size); 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 static void
BuildIndirectFields (clang::ASTContext *ast, BuildIndirectFields (clang::ASTContext *ast,
lldb::clang_type_t record_qual_type); lldb::clang_type_t record_qual_type);

View File

@ -1685,7 +1685,18 @@ SymbolFileDWARF::ParseChildMembers
// Skip static members // Skip static members
if (is_external && member_byte_offset == UINT32_MAX) 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; break;
}
if (is_artificial == false) if (is_artificial == false)
{ {

View File

@ -1990,10 +1990,10 @@ ClangASTContext::AddFieldToRecordType
} }
} }
field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
if (field) if (field)
{ {
field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
record_decl->addDecl(field); record_decl->addDecl(field);
#ifdef LLDB_CONFIGURATION_DEBUG #ifdef LLDB_CONFIGURATION_DEBUG
@ -2020,6 +2020,51 @@ ClangASTContext::AddFieldToRecordType
return field; 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, static clang::AccessSpecifier UnifyAccessSpecifiers (clang::AccessSpecifier lhs,
clang::AccessSpecifier rhs) clang::AccessSpecifier rhs)
{ {