From 1be10fca5f2b290b956710d9c03c14b0c82f7ef4 Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Wed, 29 Sep 2010 01:12:09 +0000 Subject: Fixed the forward declaration issue that was present in the DWARF parser after adding methods to C++ and objective C classes. In order to make methods, we need the function prototype which means we need the arguments. Parsing these could cause a circular reference that caused an assertion. Added a new typedef for the clang opaque types which are just void pointers: lldb::clang_type_t. This appears in lldb-types.h. This was fixed by enabling struct, union, class, and enum types to only get a forward declaration when we make the clang opaque qual type for these types. When they need to actually be resolved, lldb_private::Type will call a new function in the SymbolFile protocol to resolve a clang type when it is not fully defined (clang::TagDecl::getDefinition() returns NULL). This allows us to be a lot more lazy when parsing clang types and keeps down the amount of data that gets parsed into the ASTContext for each module. Getting the clang type from a "lldb_private::Type" object now takes a boolean that indicates if a forward declaration is ok: clang_type_t lldb_private::Type::GetClangType (bool forward_decl_is_ok); So function prototypes that define parameters that are "const T&" can now just parse the forward declaration for type 'T' and we avoid circular references in the type system. llvm-svn: 115012 --- lldb/source/Expression/ClangExpressionDeclMap.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'lldb/source/Expression/ClangExpressionDeclMap.cpp') diff --git a/lldb/source/Expression/ClangExpressionDeclMap.cpp b/lldb/source/Expression/ClangExpressionDeclMap.cpp index d1d576f1442..43c4150a0f9 100644 --- a/lldb/source/Expression/ClangExpressionDeclMap.cpp +++ b/lldb/source/Expression/ClangExpressionDeclMap.cpp @@ -709,7 +709,7 @@ ClangExpressionDeclMap::FindVariableInScope(StackFrame &frame, if (type->GetASTContext() == var->GetType()->GetClangAST()) { - if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var->GetType()->GetOpaqueClangQualType())) + if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var->GetType()->GetClangType())) return NULL; } else @@ -759,7 +759,7 @@ ClangExpressionDeclMap::GetDecls(NameSearchContext &context, if (!this_type) return; - TypeFromUser this_user_type(this_type->GetOpaqueClangQualType(), + TypeFromUser this_user_type(this_type->GetClangType(), this_type->GetClangAST()); m_object_pointer_type = this_user_type; @@ -836,7 +836,7 @@ ClangExpressionDeclMap::GetDecls(NameSearchContext &context, if (type.get()) { - TypeFromUser user_type(type->GetOpaqueClangQualType(), + TypeFromUser user_type(type->GetClangType(), type->GetClangAST()); AddOneType(context, user_type, false); @@ -866,7 +866,7 @@ ClangExpressionDeclMap::GetVariableValue(ExecutionContext &exe_ctx, return NULL; } - void *var_opaque_type = var_type->GetOpaqueClangQualType(); + void *var_opaque_type = var_type->GetClangType(); if (!var_opaque_type) { @@ -1043,7 +1043,7 @@ ClangExpressionDeclMap::AddOneFunction(NameSearchContext &context, return; } - fun_opaque_type = fun_type->GetOpaqueClangQualType(); + fun_opaque_type = fun_type->GetClangType(); if (!fun_opaque_type) { -- cgit v1.2.3