[Lldb-commits] [lldb] r249747 - Moved the target specific ClangASTContext initialization over into ClangASTContext::CreateInstance.
Greg Clayton via lldb-commits
lldb-commits at lists.llvm.org
Thu Oct 8 14:04:34 PDT 2015
Author: gclayton
Date: Thu Oct 8 16:04:34 2015
New Revision: 249747
URL: http://llvm.org/viewvc/llvm-project?rev=249747&view=rev
Log:
Moved the target specific ClangASTContext initialization over into ClangASTContext::CreateInstance.
This involved changing the TypeSystem::CreateInstance to take a module or a target. This allows type systems to create an AST for modules (no expression support needed) or targets (expression support is needed) and return the correct class instance for both cases.
Modified:
lldb/trunk/include/lldb/Core/Module.h
lldb/trunk/include/lldb/Symbol/ClangASTContext.h
lldb/trunk/include/lldb/Symbol/GoASTContext.h
lldb/trunk/include/lldb/Symbol/TypeSystem.h
lldb/trunk/include/lldb/Target/Target.h
lldb/trunk/include/lldb/lldb-forward.h
lldb/trunk/include/lldb/lldb-private-interfaces.h
lldb/trunk/source/Core/Module.cpp
lldb/trunk/source/Symbol/ClangASTContext.cpp
lldb/trunk/source/Symbol/GoASTContext.cpp
lldb/trunk/source/Symbol/TypeSystem.cpp
lldb/trunk/source/Target/Target.cpp
Modified: lldb/trunk/include/lldb/Core/Module.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Module.h?rev=249747&r1=249746&r2=249747&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Module.h (original)
+++ lldb/trunk/include/lldb/Core/Module.h Thu Oct 8 16:04:34 2015
@@ -18,6 +18,7 @@
#include "lldb/Host/Mutex.h"
#include "lldb/Host/TimeValue.h"
#include "lldb/Symbol/SymbolContextScope.h"
+#include "lldb/Symbol/TypeSystem.h"
#include "lldb/Target/PathMappingList.h"
namespace lldb_private {
@@ -1098,7 +1099,6 @@ public:
bool &match_name_after_lookup);
protected:
- typedef std::map<lldb::LanguageType, lldb::TypeSystemSP> TypeSystemMap;
//------------------------------------------------------------------
// Member Variables
//------------------------------------------------------------------
Modified: lldb/trunk/include/lldb/Symbol/ClangASTContext.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangASTContext.h?rev=249747&r1=249746&r2=249747&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/ClangASTContext.h (original)
+++ lldb/trunk/include/lldb/Symbol/ClangASTContext.h Thu Oct 8 16:04:34 2015
@@ -71,7 +71,7 @@ public:
GetPluginNameStatic ();
static lldb::TypeSystemSP
- CreateInstance (lldb::LanguageType language, const lldb_private::ArchSpec &arch);
+ CreateInstance (lldb::LanguageType language, Module *module, Target *target);
static void
Initialize ();
@@ -1153,6 +1153,7 @@ protected:
std::unique_ptr<clang::SelectorTable> m_selector_table_ap;
std::unique_ptr<clang::Builtin::Context> m_builtins_ap;
std::unique_ptr<DWARFASTParser> m_dwarf_ast_parser_ap;
+ std::unique_ptr<ClangASTSource> m_scratch_ast_source_ap;
CompleteTagDeclCallback m_callback_tag_decl;
CompleteObjCInterfaceDeclCallback m_callback_objc_decl;
void * m_callback_baton;
Modified: lldb/trunk/include/lldb/Symbol/GoASTContext.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/GoASTContext.h?rev=249747&r1=249746&r2=249747&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/GoASTContext.h (original)
+++ lldb/trunk/include/lldb/Symbol/GoASTContext.h Thu Oct 8 16:04:34 2015
@@ -40,7 +40,7 @@ class GoASTContext : public TypeSystem
GetPluginNameStatic ();
static lldb::TypeSystemSP
- CreateInstance (lldb::LanguageType language, const lldb_private::ArchSpec &arch);
+ CreateInstance (lldb::LanguageType language, Module *module, Target *target);
static void
Initialize ();
Modified: lldb/trunk/include/lldb/Symbol/TypeSystem.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/TypeSystem.h?rev=249747&r1=249746&r2=249747&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/TypeSystem.h (original)
+++ lldb/trunk/include/lldb/Symbol/TypeSystem.h Thu Oct 8 16:04:34 2015
@@ -11,10 +11,13 @@
#define liblldb_TypeSystem_h_
#include <functional>
+#include <map>
#include <string>
+
#include "lldb/lldb-private.h"
#include "lldb/Core/PluginInterface.h"
#include "lldb/Expression/Expression.h"
+#include "lldb/Host/Mutex.h"
#include "lldb/Symbol/CompilerDeclContext.h"
#include "llvm/ADT/APSInt.h"
#include "llvm/Support/Casting.h"
@@ -71,7 +74,10 @@ public:
LLVMCastKind getKind() const { return m_kind; }
static lldb::TypeSystemSP
- CreateInstance (lldb::LanguageType language, const lldb_private::ArchSpec &arch);
+ CreateInstance (lldb::LanguageType language, Module *module);
+
+ static lldb::TypeSystemSP
+ CreateInstance (lldb::LanguageType language, Target *target);
//----------------------------------------------------------------------
// Constructors and Destructors
@@ -521,7 +527,34 @@ protected:
SymbolFile *m_sym_file;
};
-
+
+ class TypeSystemMap
+ {
+ public:
+ TypeSystemMap ();
+ ~TypeSystemMap();
+
+ void
+ Clear ();
+
+ // Iterate through all of the type systems that are created. Return true
+ // from callback to keep iterating, false to stop iterating.
+ void
+ ForEach (std::function <bool(TypeSystem *)> const &callback);
+
+ TypeSystem *
+ GetTypeSystemForLanguage (lldb::LanguageType language, Module *module, bool can_create);
+
+ TypeSystem *
+ GetTypeSystemForLanguage (lldb::LanguageType language, Target *target, bool can_create);
+
+ protected:
+ typedef std::map<lldb::LanguageType, lldb::TypeSystemSP> collection;
+ mutable Mutex m_mutex; ///< A mutex to keep this object happy in multi-threaded environments.
+ collection m_map;
+ };
+
+
} // namespace lldb_private
#endif // #ifndef liblldb_TypeSystem_h_
Modified: lldb/trunk/include/lldb/Target/Target.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Target.h?rev=249747&r1=249746&r2=249747&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Target.h (original)
+++ lldb/trunk/include/lldb/Target/Target.h Thu Oct 8 16:04:34 2015
@@ -25,6 +25,7 @@
#include "lldb/Core/ModuleList.h"
#include "lldb/Core/UserSettingsController.h"
#include "lldb/Expression/Expression.h"
+#include "lldb/Symbol/TypeSystem.h"
#include "lldb/Target/ExecutionContextScope.h"
#include "lldb/Target/PathMappingList.h"
#include "lldb/Target/ProcessLaunchInfo.h"
@@ -1504,10 +1505,7 @@ public:
lldb::SearchFilterSP
GetSearchFilterForModuleAndCUList (const FileSpecList *containingModules, const FileSpecList *containingSourceFiles);
-protected:
- ClangASTContext *
- GetScratchClangASTContextImpl(Error *error);
-
+protected:
//------------------------------------------------------------------
// Member variables.
//------------------------------------------------------------------
@@ -1528,11 +1526,8 @@ protected:
lldb::ProcessSP m_process_sp;
lldb::SearchFilterSP m_search_filter_sp;
PathMappingList m_image_search_paths;
-
- typedef std::map<lldb::LanguageType, lldb::TypeSystemSP> TypeSystemMap;
TypeSystemMap m_scratch_type_system_map;
- lldb::ClangASTSourceUP m_scratch_ast_source_ap;
lldb::ClangASTImporterUP m_ast_importer_ap;
lldb::ClangModulesDeclVendorUP m_clang_modules_decl_vendor_ap;
Modified: lldb/trunk/include/lldb/lldb-forward.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-forward.h?rev=249747&r1=249746&r2=249747&view=diff
==============================================================================
--- lldb/trunk/include/lldb/lldb-forward.h (original)
+++ lldb/trunk/include/lldb/lldb-forward.h Thu Oct 8 16:04:34 2015
@@ -311,7 +311,6 @@ namespace lldb {
typedef std::shared_ptr<lldb_private::Broadcaster> BroadcasterSP;
typedef std::unique_ptr<lldb_private::ClangASTContext> ClangASTContextUP;
typedef std::unique_ptr<lldb_private::ClangASTImporter> ClangASTImporterUP;
- typedef std::unique_ptr<lldb_private::ClangASTSource> ClangASTSourceUP;
typedef std::unique_ptr<lldb_private::ClangModulesDeclVendor> ClangModulesDeclVendorUP;
typedef std::unique_ptr<lldb_private::ClangPersistentVariables> ClangPersistentVariablesUP;
typedef std::shared_ptr<lldb_private::UserExpression> UserExpressionSP;
Modified: lldb/trunk/include/lldb/lldb-private-interfaces.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-private-interfaces.h?rev=249747&r1=249746&r2=249747&view=diff
==============================================================================
--- lldb/trunk/include/lldb/lldb-private-interfaces.h (original)
+++ lldb/trunk/include/lldb/lldb-private-interfaces.h Thu Oct 8 16:04:34 2015
@@ -46,7 +46,7 @@ namespace lldb_private
typedef lldb::MemoryHistorySP (*MemoryHistoryCreateInstance) (const lldb::ProcessSP &process_sp);
typedef lldb::InstrumentationRuntimeType (*InstrumentationRuntimeGetType) ();
typedef lldb::InstrumentationRuntimeSP (*InstrumentationRuntimeCreateInstance) (const lldb::ProcessSP &process_sp);
- typedef lldb::TypeSystemSP (*TypeSystemCreateInstance) (lldb::LanguageType language, const lldb_private::ArchSpec &arch);
+ typedef lldb::TypeSystemSP (*TypeSystemCreateInstance) (lldb::LanguageType language, Module *module, Target *target);
typedef int (*ComparisonFunction)(const void *, const void *);
typedef void (*DebuggerInitializeCallback)(Debugger &debugger);
Modified: lldb/trunk/source/Core/Module.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Module.cpp?rev=249747&r1=249746&r2=249747&view=diff
==============================================================================
--- lldb/trunk/source/Core/Module.cpp (original)
+++ lldb/trunk/source/Core/Module.cpp Thu Oct 8 16:04:34 2015
@@ -419,26 +419,7 @@ Module::GetUUID()
TypeSystem *
Module::GetTypeSystemForLanguage (LanguageType language)
{
- Mutex::Locker locker (m_mutex);
- TypeSystemMap::iterator pos = m_type_system_map.find(language);
- if (pos != m_type_system_map.end())
- return pos->second.get();
-
- for (const auto &pair : m_type_system_map)
- {
- if (pair.second && pair.second->SupportsLanguage(language))
- {
- // Add a new mapping for "language" to point to an already existing
- // TypeSystem that supports this language
- m_type_system_map[language] = pair.second;
- return pair.second.get();
- }
- }
-
- // Cache even if we get a shared pointer that contains null type system back
- lldb::TypeSystemSP type_system_sp = TypeSystem::CreateInstance (language, GetArchitecture());
- m_type_system_map[language] = type_system_sp;
- return type_system_sp.get();
+ return m_type_system_map.GetTypeSystemForLanguage(language, this, true);
}
void
Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=249747&r1=249746&r2=249747&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/ClangASTContext.cpp (original)
+++ lldb/trunk/source/Symbol/ClangASTContext.cpp Thu Oct 8 16:04:34 2015
@@ -367,36 +367,59 @@ ClangASTContext::GetPluginVersion()
}
lldb::TypeSystemSP
-ClangASTContext::CreateInstance (lldb::LanguageType language, const lldb_private::ArchSpec &arch)
+ClangASTContext::CreateInstance (lldb::LanguageType language, Module *module, Target *target)
{
if (ClangASTContextSupportsLanguage(language))
{
- std::shared_ptr<ClangASTContext> ast_sp(new ClangASTContext);
- if (ast_sp)
+ ArchSpec arch;
+ if (module)
+ arch = module->GetArchitecture();
+ else if (target)
+ arch = target->GetArchitecture();
+
+ if (arch.IsValid())
{
- if (arch.IsValid())
+ ArchSpec fixed_arch = arch;
+ // LLVM wants this to be set to iOS or MacOSX; if we're working on
+ // a bare-boards type image, change the triple for llvm's benefit.
+ if (fixed_arch.GetTriple().getVendor() == llvm::Triple::Apple &&
+ fixed_arch.GetTriple().getOS() == llvm::Triple::UnknownOS)
+ {
+ if (fixed_arch.GetTriple().getArch() == llvm::Triple::arm ||
+ fixed_arch.GetTriple().getArch() == llvm::Triple::aarch64 ||
+ fixed_arch.GetTriple().getArch() == llvm::Triple::thumb)
+ {
+ fixed_arch.GetTriple().setOS(llvm::Triple::IOS);
+ }
+ else
+ {
+ fixed_arch.GetTriple().setOS(llvm::Triple::MacOSX);
+ }
+ }
+
+ if (module)
+ {
+ std::shared_ptr<ClangASTContext> ast_sp(new ClangASTContext);
+ if (ast_sp)
+ {
+ ast_sp->SetArchitecture (fixed_arch);
+ }
+ return ast_sp;
+ }
+ else if (target)
{
- ArchSpec fixed_arch = arch;
- // LLVM wants this to be set to iOS or MacOSX; if we're working on
- // a bare-boards type image, change the triple for llvm's benefit.
- if (fixed_arch.GetTriple().getVendor() == llvm::Triple::Apple &&
- fixed_arch.GetTriple().getOS() == llvm::Triple::UnknownOS)
+ std::shared_ptr<ClangASTContextForExpressions> ast_sp(new ClangASTContextForExpressions(*target));
+ if (ast_sp)
{
- if (fixed_arch.GetTriple().getArch() == llvm::Triple::arm ||
- fixed_arch.GetTriple().getArch() == llvm::Triple::aarch64 ||
- fixed_arch.GetTriple().getArch() == llvm::Triple::thumb)
- {
- fixed_arch.GetTriple().setOS(llvm::Triple::IOS);
- }
- else
- {
- fixed_arch.GetTriple().setOS(llvm::Triple::MacOSX);
- }
+ ast_sp->SetArchitecture(fixed_arch);
+ ast_sp->m_scratch_ast_source_ap.reset (new ClangASTSource(target->shared_from_this()));
+ ast_sp->m_scratch_ast_source_ap->InstallASTContext(ast_sp->getASTContext());
+ llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> proxy_ast_source(ast_sp->m_scratch_ast_source_ap->CreateProxy());
+ ast_sp->SetExternalSource(proxy_ast_source);
+ return ast_sp;
}
- ast_sp->SetArchitecture (fixed_arch);
}
}
- return ast_sp;
}
return lldb::TypeSystemSP();
}
Modified: lldb/trunk/source/Symbol/GoASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/GoASTContext.cpp?rev=249747&r1=249746&r2=249747&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/GoASTContext.cpp (original)
+++ lldb/trunk/source/Symbol/GoASTContext.cpp Thu Oct 8 16:04:34 2015
@@ -22,6 +22,7 @@
#include "lldb/Symbol/GoASTContext.h"
#include "lldb/Symbol/Type.h"
#include "lldb/Target/ExecutionContext.h"
+#include "lldb/Target/Target.h"
#include "Plugins/SymbolFile/DWARF/DWARFASTParserGo.h"
@@ -321,10 +322,16 @@ GoASTContext::GetPluginVersion()
}
lldb::TypeSystemSP
-GoASTContext::CreateInstance (lldb::LanguageType language, const lldb_private::ArchSpec &arch)
+GoASTContext::CreateInstance (lldb::LanguageType language, Module *module, Target *target)
{
if (language == eLanguageTypeGo)
{
+ ArchSpec arch;
+ if (module)
+ arch = module->GetArchitecture();
+ else if (target)
+ arch = target->GetArchitecture();
+
if (arch.IsValid())
{
std::shared_ptr<GoASTContext> go_ast_sp(new GoASTContext);
Modified: lldb/trunk/source/Symbol/TypeSystem.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/TypeSystem.cpp?rev=249747&r1=249746&r2=249747&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/TypeSystem.cpp (original)
+++ lldb/trunk/source/Symbol/TypeSystem.cpp Thu Oct 8 16:04:34 2015
@@ -8,6 +8,8 @@
#include "lldb/Symbol/TypeSystem.h"
+#include <set>
+
#include "lldb/Core/PluginManager.h"
#include "lldb/Symbol/CompilerType.h"
@@ -24,13 +26,28 @@ TypeSystem::~TypeSystem()
}
lldb::TypeSystemSP
-TypeSystem::CreateInstance (lldb::LanguageType language, const lldb_private::ArchSpec &arch)
+TypeSystem::CreateInstance (lldb::LanguageType language, Module *module)
{
uint32_t i = 0;
TypeSystemCreateInstance create_callback;
while ((create_callback = PluginManager::GetTypeSystemCreateCallbackAtIndex (i++)) != nullptr)
{
- lldb::TypeSystemSP type_system_sp = create_callback(language, arch);
+ lldb::TypeSystemSP type_system_sp = create_callback(language, module, nullptr);
+ if (type_system_sp)
+ return type_system_sp;
+ }
+
+ return lldb::TypeSystemSP();
+}
+
+lldb::TypeSystemSP
+TypeSystem::CreateInstance (lldb::LanguageType language, Target *target)
+{
+ uint32_t i = 0;
+ TypeSystemCreateInstance create_callback;
+ while ((create_callback = PluginManager::GetTypeSystemCreateCallbackAtIndex (i++)) != nullptr)
+ {
+ lldb::TypeSystemSP type_system_sp = create_callback(language, nullptr, target);
if (type_system_sp)
return type_system_sp;
}
@@ -91,3 +108,98 @@ TypeSystem::ShouldPrintAsOneLiner (void*
{
return eLazyBoolCalculate;
}
+
+#pragma mark TypeSystemMap
+
+TypeSystemMap::TypeSystemMap() :
+ m_mutex (),
+ m_map ()
+{
+}
+
+TypeSystemMap::~TypeSystemMap()
+{
+}
+
+void
+TypeSystemMap::Clear ()
+{
+ Mutex::Locker locker (m_mutex);
+ m_map.clear();
+}
+
+
+void
+TypeSystemMap::ForEach (std::function <bool(TypeSystem *)> const &callback)
+{
+ Mutex::Locker locker (m_mutex);
+ // Use a std::set so we only call the callback once for each unique
+ // TypeSystem instance
+ std::set<TypeSystem *> visited;
+ for (auto pair : m_map)
+ {
+ TypeSystem *type_system = pair.second.get();
+ if (type_system && !visited.count(type_system))
+ {
+ visited.insert(type_system);
+ if (callback (type_system) == false)
+ break;
+ }
+ }
+}
+
+TypeSystem *
+TypeSystemMap::GetTypeSystemForLanguage (lldb::LanguageType language, Module *module, bool can_create)
+{
+ Mutex::Locker locker (m_mutex);
+ collection::iterator pos = m_map.find(language);
+ if (pos != m_map.end())
+ return pos->second.get();
+
+ for (const auto &pair : m_map)
+ {
+ if (pair.second && pair.second->SupportsLanguage(language))
+ {
+ // Add a new mapping for "language" to point to an already existing
+ // TypeSystem that supports this language
+ m_map[language] = pair.second;
+ return pair.second.get();
+ }
+ }
+
+ if (!can_create)
+ return nullptr;
+
+ // Cache even if we get a shared pointer that contains null type system back
+ lldb::TypeSystemSP type_system_sp = TypeSystem::CreateInstance (language, module);
+ m_map[language] = type_system_sp;
+ return type_system_sp.get();
+}
+
+TypeSystem *
+TypeSystemMap::GetTypeSystemForLanguage (lldb::LanguageType language, Target *target, bool can_create)
+{
+ Mutex::Locker locker (m_mutex);
+ collection::iterator pos = m_map.find(language);
+ if (pos != m_map.end())
+ return pos->second.get();
+
+ for (const auto &pair : m_map)
+ {
+ if (pair.second && pair.second->SupportsLanguage(language))
+ {
+ // Add a new mapping for "language" to point to an already existing
+ // TypeSystem that supports this language
+ m_map[language] = pair.second;
+ return pair.second.get();
+ }
+ }
+
+ if (!can_create)
+ return nullptr;
+
+ // Cache even if we get a shared pointer that contains null type system back
+ lldb::TypeSystemSP type_system_sp = TypeSystem::CreateInstance (language, target);
+ m_map[language] = type_system_sp;
+ return type_system_sp.get();
+}
Modified: lldb/trunk/source/Target/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Target.cpp?rev=249747&r1=249746&r2=249747&view=diff
==============================================================================
--- lldb/trunk/source/Target/Target.cpp (original)
+++ lldb/trunk/source/Target/Target.cpp Thu Oct 8 16:04:34 2015
@@ -85,7 +85,6 @@ Target::Target(Debugger &debugger, const
m_process_sp (),
m_search_filter_sp (),
m_image_search_paths (ImageSearchPathsChanged, this),
- m_scratch_ast_source_ap (),
m_ast_importer_ap (),
m_source_manager_ap(),
m_stop_hooks (),
@@ -1122,8 +1121,7 @@ Target::ClearModules(bool delete_locatio
ModulesDidUnload (m_images, delete_locations);
m_section_load_history.Clear();
m_images.Clear();
- m_scratch_type_system_map.clear();
- m_scratch_ast_source_ap.reset();
+ m_scratch_type_system_map.Clear();
m_ast_importer_ap.reset();
}
@@ -1892,6 +1890,9 @@ Target::ImageSearchPathsChanged
TypeSystem *
Target::GetScratchTypeSystemForLanguage (Error *error, lldb::LanguageType language, bool create_on_demand)
{
+ if (!m_valid)
+ return nullptr;
+
if (error)
{
error->Clear();
@@ -1902,43 +1903,8 @@ Target::GetScratchTypeSystemForLanguage
{
language = eLanguageTypeC;
}
-
- TypeSystemMap::iterator pos = m_scratch_type_system_map.find(language);
-
- if (pos != m_scratch_type_system_map.end())
- return pos->second.get();
-
- for (const auto &pair : m_scratch_type_system_map)
- {
- if (pair.second && pair.second->SupportsLanguage(language))
- {
- // Add a new mapping for "language" to point to an already existing
- // TypeSystem that supports this language
- m_scratch_type_system_map[language] = pair.second;
- return pair.second.get();
- }
- }
-
- if (!create_on_demand)
- return nullptr;
-
- if (Language::LanguageIsC(language)
- || Language::LanguageIsObjC(language)
- || Language::LanguageIsCPlusPlus(language))
- {
- TypeSystem* ret = GetScratchClangASTContextImpl(error);
- if (ret)
- {
- m_scratch_type_system_map[language].reset(ret);
- return m_scratch_type_system_map[language].get();
- }
- else
- {
- return nullptr;
- }
- }
- return nullptr;
+ return m_scratch_type_system_map.GetTypeSystemForLanguage(language, this, create_on_demand);
}
PersistentExpressionState *
@@ -2032,41 +1998,30 @@ Target::GetUtilityFunctionForLanguage (c
ClangASTContext *
Target::GetScratchClangASTContext(bool create_on_demand)
{
- if (TypeSystem* type_system = GetScratchTypeSystemForLanguage(nullptr, eLanguageTypeC, create_on_demand))
- {
- return llvm::dyn_cast<ClangASTContext>(type_system);
- }
- else
+ if (m_valid)
{
- return nullptr;
+ if (TypeSystem* type_system = GetScratchTypeSystemForLanguage(nullptr, eLanguageTypeC, create_on_demand))
+ return llvm::dyn_cast<ClangASTContext>(type_system);
}
+ return nullptr;
}
-ClangASTContext *
-Target::GetScratchClangASTContextImpl(Error *error)
-{
- ClangASTContextForExpressions *ast_context = new ClangASTContextForExpressions(*this);
-
- m_scratch_ast_source_ap.reset (new ClangASTSource(shared_from_this()));
- m_scratch_ast_source_ap->InstallASTContext(ast_context->getASTContext());
- llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> proxy_ast_source(m_scratch_ast_source_ap->CreateProxy());
- ast_context->SetExternalSource(proxy_ast_source);
-
- return ast_context;
-}
ClangASTImporter *
Target::GetClangASTImporter()
{
- ClangASTImporter *ast_importer = m_ast_importer_ap.get();
-
- if (!ast_importer)
+ if (m_valid)
{
- ast_importer = new ClangASTImporter();
- m_ast_importer_ap.reset(ast_importer);
+ ClangASTImporter *ast_importer = m_ast_importer_ap.get();
+
+ if (!ast_importer)
+ {
+ ast_importer = new ClangASTImporter();
+ m_ast_importer_ap.reset(ast_importer);
+ }
+ return ast_importer;
}
-
- return ast_importer;
+ return nullptr;
}
void
@@ -2208,56 +2163,41 @@ Target::EvaluateExpression
return execution_results;
}
+
lldb::ExpressionVariableSP
Target::GetPersistentVariable(const ConstString &name)
{
- std::set<TypeSystem *> visited;
-
- for (const auto &pair : m_scratch_type_system_map)
+ lldb::ExpressionVariableSP variable_sp;
+ m_scratch_type_system_map.ForEach([this, name, &variable_sp](TypeSystem *type_system) -> bool
{
- if (pair.second && !visited.count(pair.second.get()))
+ if (PersistentExpressionState *persistent_state = type_system->GetPersistentExpressionState())
{
- visited.insert(pair.second.get());
-
- if (PersistentExpressionState *persistent_state = pair.second->GetPersistentExpressionState())
- {
- lldb::ExpressionVariableSP variable_sp = persistent_state->GetVariable(name);
-
- if (variable_sp)
- {
- return variable_sp;
- }
- }
+ variable_sp = persistent_state->GetVariable(name);
+
+ if (variable_sp)
+ return false; // Stop iterating the ForEach
}
- }
-
- return ExpressionVariableSP();
+ return true; // Keep iterating the ForEach
+ });
+ return variable_sp;
}
lldb::addr_t
Target::GetPersistentSymbol(const ConstString &name)
{
- std::set<TypeSystem *> visited;
+ lldb::addr_t address = LLDB_INVALID_ADDRESS;
- for (const auto &pair : m_scratch_type_system_map)
+ m_scratch_type_system_map.ForEach([this, name, &address](TypeSystem *type_system) -> bool
{
- if (pair.second && !visited.count(pair.second.get()))
+ if (PersistentExpressionState *persistent_state = type_system->GetPersistentExpressionState())
{
- visited.insert(pair.second.get());
-
- if (PersistentExpressionState *persistent_state = pair.second->GetPersistentExpressionState())
- {
- lldb::addr_t address = persistent_state->LookupSymbol(name);
-
- if (address != LLDB_INVALID_ADDRESS)
- {
- return address;
- }
- }
+ address = persistent_state->LookupSymbol(name);
+ if (address != LLDB_INVALID_ADDRESS)
+ return false; // Stop iterating the ForEach
}
- }
-
- return LLDB_INVALID_ADDRESS;
+ return true; // Keep iterating the ForEach
+ });
+ return address;
}
lldb::addr_t
More information about the lldb-commits
mailing list