summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Expression/ClangExpressionDeclMap.h31
-rw-r--r--lldb/include/lldb/Expression/ClangExpressionParser.h1
-rw-r--r--lldb/source/Expression/ClangExpressionDeclMap.cpp73
-rw-r--r--lldb/source/Expression/ClangExpressionParser.cpp4
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));
OpenPOWER on IntegriCloud