diff options
author | Sean Callanan <scallanan@apple.com> | 2010-11-19 20:20:02 +0000 |
---|---|---|
committer | Sean Callanan <scallanan@apple.com> | 2010-11-19 20:20:02 +0000 |
commit | 6abfabff6158076eccdf6fcac5a12894039de2c9 (patch) | |
tree | fb2b0b9fee6a19967b10ab70d94e663de84ddf29 | |
parent | 003c6e700b9e240a3b534a36d90c1a6c38f8811d (diff) | |
download | bcm5719-llvm-6abfabff6158076eccdf6fcac5a12894039de2c9.tar.gz bcm5719-llvm-6abfabff6158076eccdf6fcac5a12894039de2c9.zip |
Modifications to type handling logic. We no longer
perform recursive type lookups, because these are not
required for full type fidelity. We also make the
SelectorTable last for the full lifetime of the Clang
compiler; this was the source of many bugs.
llvm-svn: 119835
4 files changed, 66 insertions, 43 deletions
diff --git a/lldb/include/lldb/Expression/ClangExpressionDeclMap.h b/lldb/include/lldb/Expression/ClangExpressionDeclMap.h index fbf8a9effeb..140a345b8be 100644 --- a/lldb/include/lldb/Expression/ClangExpressionDeclMap.h +++ b/lldb/include/lldb/Expression/ClangExpressionDeclMap.h @@ -385,15 +385,7 @@ private: ConstString m_result_name; ///< The name of the result variable ($1, for example) TypeFromUser m_object_pointer_type; ///< The type of the "this" variable, if one exists. - llvm::DenseMap <const char*, bool> m_lookedup_types; ///< Contains each type that has been looked up in the current type lookup stack. - ///< m_lookedup_types is used to gate the type search in GetDecls(). If a name is - ///< not in it, the following procedure occurs: - ///< 1 The name is added to m_lookedup_types. - ///< 2 The type is looked up and added, potentially causing more type loookups. - ///< 3 The name is removed from m_lookedup_types. - ///< There must be no non-fatal error path that permits the type search to complete - ///< without removing the name from m_lookedup_types at the end. - ///< m_lookedup_type assumes single threadedness. + bool m_ignore_lookups; ///< True during an import when we should be ignoring type lookups. //------------------------------------------------------------------ /// Given a stack frame, find a variable that matches the given name and @@ -611,6 +603,27 @@ private: TypeFromUser type, lldb::addr_t addr, Error &err); + + //------------------------------------------------------------------ + /// A wrapper for ClangASTContext::CopyType that sets a flag that + /// indicates that we should not respond to queries during import. + /// + /// @param[in] dest_context + /// The target AST context, typically the parser's AST context. + /// + /// @param[in] source_context + /// The source AST context, typically the AST context of whatever + /// symbol file the type was found in. + /// + /// @param[in] clang_type + /// The source type. + /// + /// @return + /// The imported type. + //------------------------------------------------------------------ + void *GuardedCopyType (clang::ASTContext *dest_context, + clang::ASTContext *source_context, + void *clang_type); }; } // namespace lldb_private diff --git a/lldb/include/lldb/Expression/ClangExpressionParser.h b/lldb/include/lldb/Expression/ClangExpressionParser.h index 31c4172a56c..612124115e0 100644 --- a/lldb/include/lldb/Expression/ClangExpressionParser.h +++ b/lldb/include/lldb/Expression/ClangExpressionParser.h @@ -177,6 +177,7 @@ private: std::auto_ptr<clang::FileSystemOptions> m_file_system_options; ///< The Clang file system options object used by the compiler std::auto_ptr<clang::CompilerInstance> m_compiler; ///< The Clang compiler used to parse expressions into IR std::auto_ptr<clang::Builtin::Context> m_builtin_context; ///< Context for Clang built-ins + std::auto_ptr<clang::SelectorTable> m_selector_table; ///< Selector table for Objective-C methods std::auto_ptr<clang::ASTContext> m_ast_context; ///< The AST context used to hold types and names for the parser std::auto_ptr<clang::CodeGenerator> m_code_generator; ///< [owned by the Execution Engine] The Clang object that generates IR RecordingMemoryManager *m_jit_mm; ///< The memory manager for the LLVM JIT diff --git a/lldb/source/Expression/ClangExpressionDeclMap.cpp b/lldb/source/Expression/ClangExpressionDeclMap.cpp index bc861746014..0775b4fea1d 100644 --- a/lldb/source/Expression/ClangExpressionDeclMap.cpp +++ b/lldb/source/Expression/ClangExpressionDeclMap.cpp @@ -57,7 +57,7 @@ ClangExpressionDeclMap::ClangExpressionDeclMap (ExecutionContext *exe_ctx) : m_materialized_location (0), m_result_name (), m_object_pointer_type (), - m_lookedup_types () + m_ignore_lookups (false) { if (exe_ctx) { @@ -990,6 +990,13 @@ ClangExpressionDeclMap::GetDecls (NameSearchContext &context, const ConstString // Back out in all cases where we're not fully initialized if (m_exe_ctx.frame == NULL) return; + + if (m_ignore_lookups) + { + if (log) + log->Printf("Ignoring a query during an import"); + return; + } SymbolContextList sc_list; @@ -1117,36 +1124,22 @@ ClangExpressionDeclMap::GetDecls (NameSearchContext &context, const ConstString AddOneVariable(context, pvar); } - - // See information on gating of this operation next to the definition for - // m_lookedup_types. - - if (m_lookedup_types.find(name_unique_cstr) == m_lookedup_types.end()) - { - // 1 The name is added to m_lookedup_types. - m_lookedup_types.insert(std::pair<const char*, bool>(name_unique_cstr, true)); - - // 2 The type is looked up and added, potentially causing more type loookups. - lldb::TypeSP type_sp (m_sym_ctx.FindTypeByName (name)); + lldb::TypeSP type_sp (m_sym_ctx.FindTypeByName (name)); - if (type_sp) + if (type_sp) + { + if (log) { - if (log) - { - log->Printf ("Matching type found for \"%s\": ", name.GetCString()); - StreamString strm; - type_sp->Dump(&strm, true); - log->PutCString (strm.GetData()); - } + log->Printf ("Matching type found for \"%s\": ", name.GetCString()); + StreamString strm; + type_sp->Dump(&strm, true); + log->PutCString (strm.GetData()); + } - TypeFromUser user_type(type_sp->GetClangType(), + TypeFromUser user_type(type_sp->GetClangType(), type_sp->GetClangAST()); - AddOneType(context, user_type, false); - } - - // 3 The name is removed from m_lookedup_types. - m_lookedup_types.erase(name_unique_cstr); + AddOneType(context, user_type, false); } } @@ -1225,7 +1218,7 @@ ClangExpressionDeclMap::GetVariableValue if (parser_ast_context) { - type_to_use = ClangASTContext::CopyType(parser_ast_context, var_ast_context, var_opaque_type); + type_to_use = GuardedCopyType(parser_ast_context, var_ast_context, var_opaque_type); if (parser_type) *parser_type = TypeFromParser(type_to_use, parser_ast_context); @@ -1310,9 +1303,9 @@ ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, TypeFromUser user_type = pvar->m_user_type; - TypeFromParser parser_type(ClangASTContext::CopyType(context.GetASTContext(), - user_type.GetASTContext(), - user_type.GetOpaqueQualType()), + TypeFromParser parser_type(GuardedCopyType(context.GetASTContext(), + user_type.GetASTContext(), + user_type.GetOpaqueQualType()), context.GetASTContext()); NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); @@ -1386,7 +1379,7 @@ ClangExpressionDeclMap::AddOneFunction(NameSearchContext &context, TypeList *type_list = fun_type->GetTypeList(); fun_ast_context = type_list->GetClangASTContext().getASTContext(); - void *copied_type = ClangASTContext::CopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type); + void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type); fun_decl = context.AddFunDecl(copied_type); } @@ -1436,7 +1429,7 @@ ClangExpressionDeclMap::AddOneType(NameSearchContext &context, clang::ASTContext *parser_ast_context = context.GetASTContext(); clang::ASTContext *user_ast_context = ut.GetASTContext(); - void *copied_type = ClangASTContext::CopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType()); + void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType()); TypeFromParser parser_type(copied_type, parser_ast_context); @@ -1471,3 +1464,19 @@ ClangExpressionDeclMap::AddOneType(NameSearchContext &context, context.AddTypeDecl(copied_type); } + +void * +ClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context, + ASTContext *source_context, + void *clang_type) +{ + m_ignore_lookups = true; + + void *ret = ClangASTContext::CopyType (dest_context, + source_context, + clang_type); + + m_ignore_lookups = false; + + return ret; +} diff --git a/lldb/source/Expression/ClangExpressionParser.cpp b/lldb/source/Expression/ClangExpressionParser.cpp index ad0807a5c73..ffc2c9dc27f 100644 --- a/lldb/source/Expression/ClangExpressionParser.cpp +++ b/lldb/source/Expression/ClangExpressionParser.cpp @@ -254,14 +254,14 @@ ClangExpressionParser::ClangExpressionParser(const char *target_triple, // 6. Most of this we get from the CompilerInstance, but we // also want to give the context an ExternalASTSource. - SelectorTable selector_table; + m_selector_table.reset(new SelectorTable()); m_builtin_context.reset(new Builtin::Context(m_compiler->getTarget())); std::auto_ptr<clang::ASTContext> ast_context(new ASTContext(m_compiler->getLangOpts(), m_compiler->getSourceManager(), m_compiler->getTarget(), m_compiler->getPreprocessor().getIdentifierTable(), - selector_table, + *m_selector_table.get(), *m_builtin_context.get(), 0)); |