summaryrefslogtreecommitdiffstats
path: root/lldb
diff options
context:
space:
mode:
Diffstat (limited to 'lldb')
-rw-r--r--lldb/include/lldb/Expression/ClangASTSource.h211
-rw-r--r--lldb/include/lldb/Expression/ClangExpressionDeclMap.h54
-rw-r--r--lldb/source/Expression/ClangASTSource.cpp54
-rw-r--r--lldb/source/Expression/ClangExpressionDeclMap.cpp40
-rw-r--r--lldb/source/Expression/ClangExpressionParser.cpp3
5 files changed, 185 insertions, 177 deletions
diff --git a/lldb/include/lldb/Expression/ClangASTSource.h b/lldb/include/lldb/Expression/ClangASTSource.h
index 66e9fe6c437..4d46a2fbe1d 100644
--- a/lldb/include/lldb/Expression/ClangASTSource.h
+++ b/lldb/include/lldb/Expression/ClangASTSource.h
@@ -39,17 +39,14 @@ public:
///
/// Initializes class variabes.
///
- /// @param[in] context
- /// A reference to the AST context provided by the parser.
- ///
/// @param[in] declMap
/// A reference to the LLDB object that handles entity lookup.
//------------------------------------------------------------------
- ClangASTSource (clang::ASTContext &context,
- ClangExpressionDeclMap &decl_map) :
- m_ast_context (context),
- m_decl_map (decl_map),
- m_active_lookups ()
+ ClangASTSource () :
+ m_ast_context (NULL),
+ m_active_lookups (),
+ m_import_in_progress (false),
+ m_lookups_enabled (false)
{
}
@@ -59,66 +56,34 @@ public:
~ClangASTSource();
//------------------------------------------------------------------
- /// Interface stub that returns NULL.
- //------------------------------------------------------------------
- virtual clang::Decl *
- GetExternalDecl(uint32_t)
- {
- // These are only required for AST source that want to lazily load
- // the declarations (or parts thereof) that they return.
- return NULL;
- }
-
- //------------------------------------------------------------------
- /// Interface stub that returns NULL.
+ /// Interface stubs.
//------------------------------------------------------------------
- virtual clang::Stmt *
- GetExternalDeclStmt(uint64_t)
- {
- // These are only required for AST source that want to lazily load
- // the declarations (or parts thereof) that they return.
- return NULL;
- }
+ clang::Decl *GetExternalDecl (uint32_t) { return NULL; }
+ clang::Stmt *GetExternalDeclStmt (uint64_t) { return NULL; }
+ clang::Selector GetExternalSelector (uint32_t) { return clang::Selector(); }
+ uint32_t GetNumExternalSelectors () { return 0; }
+ clang::CXXBaseSpecifier *GetExternalCXXBaseSpecifiers (uint64_t Offset)
+ { return NULL; }
+ void MaterializeVisibleDecls (const clang::DeclContext *DC)
+ { return; }
- //------------------------------------------------------------------
- /// Interface stub that returns an undifferentiated Selector.
- //------------------------------------------------------------------
- virtual clang::Selector
- GetExternalSelector(uint32_t)
- {
- // These are also optional, although it might help with ObjC
- // debugging if we have respectable signatures. But a more
- // efficient interface (that didn't require scanning all files
- // for method signatures!) might help.
- return clang::Selector();
- }
-
- //------------------------------------------------------------------
- /// Interface stub that returns 0.
- //------------------------------------------------------------------
- virtual uint32_t
- GetNumExternalSelectors()
+ void InstallASTContext (clang::ASTContext *ast_context)
{
- // These are also optional, although it might help with ObjC
- // debugging if we have respectable signatures. But a more
- // efficient interface (that didn't require scanning all files
- // for method signatures!) might help.
- return 0;
+ m_ast_context = ast_context;
}
- //------------------------------------------------------------------
- /// Interface stub that returns NULL.
- //------------------------------------------------------------------
- virtual clang::CXXBaseSpecifier *
- GetExternalCXXBaseSpecifiers(uint64_t Offset)
- {
- return NULL;
- }
-
+ //
+ // APIs for ExternalASTSource
+ //
+
//------------------------------------------------------------------
/// Look up all Decls that match a particular name. Only handles
- /// Identifiers. Passes the request on to DeclMap, and calls
- /// SetExternalVisibleDeclsForName with the result.
+ /// Identifiers and DeclContexts that are either NamespaceDecls or
+ /// TranslationUnitDecls. Calls SetExternalVisibleDeclsForName with
+ /// the result.
+ ///
+ /// The work for this function is done by
+ /// void FindExternalVisibleDecls (NameSearchContext &);
///
/// @param[in] DC
/// The DeclContext to register the found Decls in.
@@ -129,31 +94,46 @@ public:
/// @return
/// Whatever SetExternalVisibleDeclsForName returns.
//------------------------------------------------------------------
- virtual clang::DeclContextLookupResult
+ clang::DeclContextLookupResult
FindExternalVisibleDeclsByName (const clang::DeclContext *DC,
clang::DeclarationName Name);
//------------------------------------------------------------------
- /// Interface stub.
- //------------------------------------------------------------------
- virtual void
- MaterializeVisibleDecls (const clang::DeclContext *DC);
-
- //------------------------------------------------------------------
- /// Interface stub that returns true.
+ /// Enumerate all Decls in a given lexical context.
+ ///
+ /// @param[in] DC
+ /// The DeclContext being searched.
+ ///
+ /// @param[in] isKindWeWant
+ /// If non-NULL, a callback function that returns true given the
+ /// DeclKinds of desired Decls, and false otherwise.
+ ///
+ /// @param[in] Decls
+ /// A vector that is filled in with matching Decls.
//------------------------------------------------------------------
- virtual clang::ExternalLoadResult
+ virtual clang::ExternalLoadResult
FindExternalLexicalDecls (const clang::DeclContext *DC,
bool (*isKindWeWant)(clang::Decl::Kind),
llvm::SmallVectorImpl<clang::Decl*> &Decls);
-
+ //------------------------------------------------------------------
+ /// Complete a TagDecl.
+ ///
+ /// @param[in] Tag
+ /// The Decl to be completed in place.
+ //------------------------------------------------------------------
virtual void
CompleteType (clang::TagDecl *Tag);
+ //------------------------------------------------------------------
+ /// Complete an ObjCInterfaceDecl.
+ ///
+ /// @param[in] Class
+ /// The Decl to be completed in place.
+ //------------------------------------------------------------------
virtual void
CompleteType (clang::ObjCInterfaceDecl *Class);
-
+
//------------------------------------------------------------------
/// Called on entering a translation unit. Tells Clang by calling
/// setHasExternalVisibleStorage() and setHasExternalLexicalStorage()
@@ -163,13 +143,88 @@ public:
/// Unused.
//------------------------------------------------------------------
void StartTranslationUnit (clang::ASTConsumer *Consumer);
+
+ //
+ // Helper APIs
+ //
+
+ //------------------------------------------------------------------
+ /// The worker function for FindExternalVisibleDeclsByName.
+ ///
+ /// @param[in] context
+ /// The NameSearchContext to use when filing results.
+ //------------------------------------------------------------------
+ virtual void FindExternalVisibleDecls (NameSearchContext &context);
+
+ void SetImportInProgress (bool import_in_progress) { m_import_in_progress = import_in_progress; }
+ bool GetImportInProgress () { return m_import_in_progress; }
+
+ void SetLookupsEnabled (bool lookups_enabled) { m_lookups_enabled = lookups_enabled; }
+ bool GetLookupsEnabled () { return m_lookups_enabled; }
+
+ //----------------------------------------------------------------------
+ /// @class ClangASTSourceProxy ClangASTSource.h "lldb/Expression/ClangASTSource.h"
+ /// @brief Proxy for ClangASTSource
+ ///
+ /// Clang AST contexts like to own their AST sources, so this is a
+ /// state-free proxy object.
+ //----------------------------------------------------------------------
+ class ClangASTSourceProxy : public clang::ExternalASTSource
+ {
+ public:
+ ClangASTSourceProxy (ClangASTSource &original) :
+ m_original(original)
+ {
+ }
+
+ clang::DeclContextLookupResult
+ FindExternalVisibleDeclsByName (const clang::DeclContext *DC,
+ clang::DeclarationName Name)
+ {
+ return m_original.FindExternalVisibleDeclsByName(DC, Name);
+ }
+
+ virtual clang::ExternalLoadResult
+ FindExternalLexicalDecls (const clang::DeclContext *DC,
+ bool (*isKindWeWant)(clang::Decl::Kind),
+ llvm::SmallVectorImpl<clang::Decl*> &Decls)
+ {
+ return m_original.FindExternalLexicalDecls(DC, isKindWeWant, Decls);
+ }
+
+ virtual void
+ CompleteType (clang::TagDecl *Tag)
+ {
+ return m_original.CompleteType(Tag);
+ }
+
+ virtual void
+ CompleteType (clang::ObjCInterfaceDecl *Class)
+ {
+ return m_original.CompleteType(Class);
+ }
+ void StartTranslationUnit (clang::ASTConsumer *Consumer)
+ {
+ return m_original.StartTranslationUnit(Consumer);
+ }
+ private:
+ ClangASTSource &m_original;
+ };
+
+ clang::ExternalASTSource *CreateProxy()
+ {
+ return new ClangASTSourceProxy(*this);
+ }
+
protected:
friend struct NameSearchContext;
+
+ bool m_import_in_progress;
+ bool m_lookups_enabled;
- clang::ASTContext &m_ast_context; ///< The parser's AST context, for copying types into
- ClangExpressionDeclMap &m_decl_map; ///< The object that looks up named entities in LLDB
- std::set<const char *> m_active_lookups;
+ clang::ASTContext *m_ast_context; ///< The parser's AST context, for copying types into
+ std::set<const char *> m_active_lookups;
};
//----------------------------------------------------------------------
@@ -221,12 +276,6 @@ struct NameSearchContext {
m_decl_context(dc) {}
//------------------------------------------------------------------
- /// Return the AST context for the current search. Useful when copying
- /// types.
- //------------------------------------------------------------------
- clang::ASTContext *GetASTContext();
-
- //------------------------------------------------------------------
/// Create a VarDecl with the name being searched for and the provided
/// type and register it in the right places.
///
diff --git a/lldb/include/lldb/Expression/ClangExpressionDeclMap.h b/lldb/include/lldb/Expression/ClangExpressionDeclMap.h
index 670e0149313..a476e3b380c 100644
--- a/lldb/include/lldb/Expression/ClangExpressionDeclMap.h
+++ b/lldb/include/lldb/Expression/ClangExpressionDeclMap.h
@@ -25,6 +25,7 @@
#include "lldb/lldb-public.h"
#include "lldb/Core/ClangForward.h"
#include "lldb/Core/Value.h"
+#include "lldb/Expression/ClangASTSource.h"
#include "lldb/Expression/ClangExpressionVariable.h"
#include "lldb/Symbol/ClangASTImporter.h"
#include "lldb/Symbol/TaggedASTType.h"
@@ -56,7 +57,9 @@ namespace lldb_private {
/// Fourth and finally, it "dematerializes" the struct after the JITted code has
/// has executed, placing the new values back where it found the old ones.
//----------------------------------------------------------------------
-class ClangExpressionDeclMap : public ClangASTImporter::NamespaceMapCompleter
+class ClangExpressionDeclMap :
+ public ClangASTSource,
+ public ClangASTImporter::NamespaceMapCompleter
{
public:
//------------------------------------------------------------------
@@ -617,18 +620,11 @@ public:
/// @param[in] context
/// The NameSearchContext that can construct Decls for this name.
///
- /// @param[in] name
- /// The name as a plain C string. The NameSearchContext contains
- /// a DeclarationName for the name so at first the name may seem
- /// redundant, but ClangExpressionDeclMap operates in RTTI land so
- /// it can't access DeclarationName.
- ///
/// @return
/// True on success; false otherwise.
//------------------------------------------------------------------
void
- FindExternalVisibleDecls (NameSearchContext &context,
- const ConstString &name);
+ FindExternalVisibleDecls (NameSearchContext &context);
//------------------------------------------------------------------
/// [Used by ClangASTSource] Find all Decls in a context that match
@@ -656,7 +652,7 @@ public:
/// The TagDecl to be completed.
//------------------------------------------------------------------
void
- CompleteTagDecl (clang::TagDecl *tag_decl);
+ CompleteType (clang::TagDecl *tag_decl);
//------------------------------------------------------------------
/// [Used by ClangASTSource] Complete the definition of an
@@ -666,43 +662,7 @@ public:
/// The ObjCInterfaceDecl to be completed.
//------------------------------------------------------------------
void
- CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl);
-
- //------------------------------------------------------------------
- /// [Used by ClangASTSource] Report whether a $__lldb variable has
- /// been searched for yet. This is the trigger for beginning to
- /// actually look for externally-defined names. (Names that come
- /// before this are typically the names of built-ins that don't need
- /// to be looked up.)
- ///
- /// @return
- /// True if a $__lldb variable has been found.
- //------------------------------------------------------------------
- bool
- GetLookupsEnabled () const
- {
- assert(m_parser_vars.get());
- return m_parser_vars->m_enable_lookups;
- }
-
- bool
- GetImportInProgress () const
- {
- if (m_parser_vars.get())
- return m_parser_vars->m_ignore_lookups;
- return false;
- }
-
- //------------------------------------------------------------------
- /// [Used by ClangASTSource] Indicate that a $__lldb variable has
- /// been found.
- //------------------------------------------------------------------
- void
- SetLookupsEnabled ()
- {
- assert(m_parser_vars.get());
- m_parser_vars->m_enable_lookups = true;
- }
+ CompleteType (clang::ObjCInterfaceDecl *interface_decl);
//------------------------------------------------------------------
/// [Used by ClangASTImporter] Look up the modules containing a
diff --git a/lldb/source/Expression/ClangASTSource.cpp b/lldb/source/Expression/ClangASTSource.cpp
index f68e07c6b49..858bdf0737e 100644
--- a/lldb/source/Expression/ClangASTSource.cpp
+++ b/lldb/source/Expression/ClangASTSource.cpp
@@ -25,9 +25,11 @@ ClangASTSource::~ClangASTSource()
void
ClangASTSource::StartTranslationUnit(ASTConsumer *Consumer)
{
- // Tell Sema to ask us when looking into the translation unit's decl.
- m_ast_context.getTranslationUnitDecl()->setHasExternalVisibleStorage();
- m_ast_context.getTranslationUnitDecl()->setHasExternalLexicalStorage();
+ if (!m_ast_context)
+ return;
+
+ m_ast_context->getTranslationUnitDecl()->setHasExternalVisibleStorage();
+ m_ast_context->getTranslationUnitDecl()->setHasExternalLexicalStorage();
}
// The core lookup interface.
@@ -38,7 +40,10 @@ ClangASTSource::FindExternalVisibleDeclsByName
DeclarationName clang_decl_name
)
{
- if (m_decl_map.GetImportInProgress())
+ if (!m_ast_context)
+ return SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
+
+ if (GetImportInProgress())
return SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
std::string decl_name (clang_decl_name.getAsString());
@@ -77,13 +82,13 @@ ClangASTSource::FindExternalVisibleDeclsByName
}
- if (!m_decl_map.GetLookupsEnabled())
+ if (!GetLookupsEnabled())
{
// Wait until we see a '$' at the start of a name before we start doing
// any lookups so we can avoid lookup up all of the builtin types.
if (!decl_name.empty() && decl_name[0] == '$')
{
- m_decl_map.SetLookupsEnabled ();
+ SetLookupsEnabled (true);
}
else
{
@@ -105,7 +110,7 @@ ClangASTSource::FindExternalVisibleDeclsByName
// printf("[%5u] FindExternalVisibleDeclsByName() \"%s\"\n", g_depth, uniqued_const_decl_name);
llvm::SmallVector<NamedDecl*, 4> name_decls;
NameSearchContext name_search_context(*this, name_decls, clang_decl_name, decl_ctx);
- m_decl_map.FindExternalVisibleDecls(name_search_context, const_decl_name);
+ FindExternalVisibleDecls(name_search_context);
DeclContext::lookup_result result (SetExternalVisibleDeclsForName (decl_ctx, clang_decl_name, name_decls));
// --g_depth;
m_active_lookups.erase (uniqued_const_decl_name);
@@ -113,25 +118,20 @@ ClangASTSource::FindExternalVisibleDeclsByName
}
void
-ClangASTSource::CompleteType (TagDecl *tag_decl)
+ClangASTSource::FindExternalVisibleDecls (NameSearchContext &context)
{
- m_decl_map.CompleteTagDecl (tag_decl);
}
void
-ClangASTSource::CompleteType (ObjCInterfaceDecl *objc_decl)
+ClangASTSource::CompleteType (TagDecl *tag_decl)
{
- m_decl_map.CompleteObjCInterfaceDecl (objc_decl);
}
-void
-ClangASTSource::MaterializeVisibleDecls(const DeclContext *DC)
+void
+ClangASTSource::CompleteType (ObjCInterfaceDecl *objc_decl)
{
- return;
}
-// This is used to support iterating through an entire lexical context,
-// which isn't something the debugger should ever need to do.
clang::ExternalLoadResult
ClangASTSource::FindExternalLexicalDecls
(
@@ -140,13 +140,7 @@ ClangASTSource::FindExternalLexicalDecls
llvm::SmallVectorImpl<Decl*> &Decls
)
{
- return m_decl_map.FindExternalLexicalDecls (DC, isKindWeWant, Decls);
-}
-
-clang::ASTContext *
-NameSearchContext::GetASTContext()
-{
- return &m_ast_source.m_ast_context;
+ return ELR_Success;
}
clang::NamedDecl *
@@ -156,7 +150,7 @@ NameSearchContext::AddVarDecl(void *type)
assert (type && "Type for variable must be non-NULL!");
- clang::NamedDecl *Decl = VarDecl::Create(m_ast_source.m_ast_context,
+ clang::NamedDecl *Decl = VarDecl::Create(*m_ast_source.m_ast_context,
const_cast<DeclContext*>(m_decl_context),
SourceLocation(),
SourceLocation(),
@@ -173,7 +167,7 @@ NameSearchContext::AddVarDecl(void *type)
clang::NamedDecl *
NameSearchContext::AddFunDecl (void *type)
{
- clang::FunctionDecl *func_decl = FunctionDecl::Create (m_ast_source.m_ast_context,
+ clang::FunctionDecl *func_decl = FunctionDecl::Create (*m_ast_source.m_ast_context,
const_cast<DeclContext*>(m_decl_context),
SourceLocation(),
SourceLocation(),
@@ -203,7 +197,7 @@ NameSearchContext::AddFunDecl (void *type)
{
QualType arg_qual_type (func_proto_type->getArgType(ArgIndex));
- parm_var_decls.push_back(ParmVarDecl::Create (m_ast_source.m_ast_context,
+ parm_var_decls.push_back(ParmVarDecl::Create (*m_ast_source.m_ast_context,
const_cast<DeclContext*>(m_decl_context),
SourceLocation(),
SourceLocation(),
@@ -230,10 +224,10 @@ NameSearchContext::AddGenericFunDecl()
proto_info.Variadic = true;
- QualType generic_function_type(m_ast_source.m_ast_context.getFunctionType (m_ast_source.m_ast_context.UnknownAnyTy, // result
- NULL, // argument types
- 0, // number of arguments
- proto_info));
+ QualType generic_function_type(m_ast_source.m_ast_context->getFunctionType (m_ast_source.m_ast_context->UnknownAnyTy, // result
+ NULL, // argument types
+ 0, // number of arguments
+ proto_info));
return AddFunDecl(generic_function_type.getAsOpaquePtr());
}
diff --git a/lldb/source/Expression/ClangExpressionDeclMap.cpp b/lldb/source/Expression/ClangExpressionDeclMap.cpp
index 6a15b9fc3fb..6c85831bff0 100644
--- a/lldb/source/Expression/ClangExpressionDeclMap.cpp
+++ b/lldb/source/Expression/ClangExpressionDeclMap.cpp
@@ -2228,8 +2228,12 @@ ClangExpressionDeclMap::CompleteNamespaceMap (ClangASTImporter::NamespaceMapSP &
// Interface for ClangASTSource
void
-ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, const ConstString &name)
+ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context)
{
+ assert (m_ast_context);
+
+ const ConstString name(context.m_decl_name.getAsString().c_str());
+
lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
if (m_parser_vars->m_ignore_lookups)
@@ -2256,7 +2260,7 @@ ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, co
if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
{
- ClangASTImporter::NamespaceMapSP namespace_map = m_parser_vars->GetASTImporter(context.GetASTContext())->GetNamespaceMap(namespace_context);
+ ClangASTImporter::NamespaceMapSP namespace_map = m_parser_vars->GetASTImporter(m_ast_context)->GetNamespaceMap(namespace_context);
if (log && log->GetVerbose())
log->Printf(" FEVD[%u] Inspecting namespace map %p (%d entries)",
@@ -2327,6 +2331,7 @@ ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
{
assert (m_struct_vars.get());
assert (m_parser_vars.get());
+ assert (m_ast_context);
lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
@@ -2482,7 +2487,7 @@ ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
if (!ptype_type_decl)
break;
- Decl *parser_ptype_decl = ClangASTContext::CopyDecl(context.GetASTContext(), scratch_ast_context, ptype_type_decl);
+ Decl *parser_ptype_decl = ClangASTContext::CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
if (!parser_ptype_decl)
break;
@@ -2834,7 +2839,7 @@ ClangExpressionDeclMap::FindExternalLexicalDecls (const DeclContext *decl_contex
}
void
-ClangExpressionDeclMap::CompleteTagDecl (TagDecl *tag_decl)
+ClangExpressionDeclMap::CompleteType (TagDecl *tag_decl)
{
assert (m_parser_vars.get());
@@ -2859,7 +2864,7 @@ ClangExpressionDeclMap::CompleteTagDecl (TagDecl *tag_decl)
}
void
-ClangExpressionDeclMap::CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl)
+ClangExpressionDeclMap::CompleteType (clang::ObjCInterfaceDecl *interface_decl)
{
assert (m_parser_vars.get());
@@ -2877,7 +2882,6 @@ ClangExpressionDeclMap::CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *int
if (log)
{
- log->Printf(" [CompleteObjCInterfaceDecl] Completing an ObjCInterfaceDecl named %s", interface_decl->getName().str().c_str());
log->Printf(" [COID] After:");
ASTDumper dumper((Decl*)interface_decl);
dumper.ToLog(log, " [COID] ");
@@ -3011,7 +3015,7 @@ ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP v
Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
var,
- context.GetASTContext(),
+ m_ast_context,
&ut,
&pt);
@@ -3061,10 +3065,10 @@ ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
TypeFromUser user_type (pvar_sp->GetTypeFromUser());
- TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(),
+ TypeFromParser parser_type (GuardedCopyType(m_ast_context,
user_type.GetASTContext(),
user_type.GetOpaqueQualType()),
- context.GetASTContext());
+ m_ast_context);
NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
@@ -3100,8 +3104,8 @@ ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
scratch_ast_context);
- TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(context.GetASTContext(), true)),
- context.GetASTContext());
+ TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(m_ast_context, true)),
+ m_ast_context);
NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
@@ -3199,7 +3203,7 @@ ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
{
lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
- void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(),
+ void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(m_ast_context,
reg_info->encoding,
reg_info->byte_size * 8);
@@ -3211,7 +3215,7 @@ ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
}
TypeFromParser parser_type (ast_type,
- context.GetASTContext());
+ m_ast_context);
NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
@@ -3247,12 +3251,12 @@ ClangExpressionDeclMap::AddNamespace (NameSearchContext &context, ClangASTImport
const ClangNamespaceDecl &namespace_decl = namespace_decls->begin()->second;
- Decl *copied_decl = m_parser_vars->GetASTImporter(context.GetASTContext())->CopyDecl(namespace_decl.GetASTContext(),
- namespace_decl.GetNamespaceDecl());
+ Decl *copied_decl = m_parser_vars->GetASTImporter(m_ast_context)->CopyDecl(namespace_decl.GetASTContext(),
+ namespace_decl.GetNamespaceDecl());
NamespaceDecl *copied_namespace_decl = dyn_cast<NamespaceDecl>(copied_decl);
- m_parser_vars->GetASTImporter(context.GetASTContext())->RegisterNamespaceMap(copied_namespace_decl, namespace_decls);
+ m_parser_vars->GetASTImporter(m_ast_context)->RegisterNamespaceMap(copied_namespace_decl, namespace_decls);
return dyn_cast<NamespaceDecl>(copied_decl);
}
@@ -3298,7 +3302,7 @@ ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
fun_address = &fun->GetAddressRange().GetBaseAddress();
fun_ast_context = fun_type->GetClangASTContext().getASTContext();
- void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
+ void *copied_type = GuardedCopyType(m_ast_context, fun_ast_context, fun_opaque_type);
if (copied_type)
{
fun_decl = context.AddFunDecl(copied_type);
@@ -3365,7 +3369,7 @@ ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
unsigned int current_id,
bool add_method)
{
- ASTContext *parser_ast_context = context.GetASTContext();
+ ASTContext *parser_ast_context = m_ast_context;
ASTContext *user_ast_context = ut.GetASTContext();
void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
diff --git a/lldb/source/Expression/ClangExpressionParser.cpp b/lldb/source/Expression/ClangExpressionParser.cpp
index e49142687d4..50518e78e73 100644
--- a/lldb/source/Expression/ClangExpressionParser.cpp
+++ b/lldb/source/Expression/ClangExpressionParser.cpp
@@ -320,7 +320,8 @@ ClangExpressionParser::ClangExpressionParser (ExecutionContextScope *exe_scope,
if (decl_map)
{
- OwningPtr<clang::ExternalASTSource> ast_source(new ClangASTSource(*ast_context, *decl_map));
+ llvm::OwningPtr<clang::ExternalASTSource> ast_source(decl_map->CreateProxy());
+ decl_map->InstallASTContext(ast_context.get());
ast_context->setExternalSource(ast_source);
}
OpenPOWER on IntegriCloud